1. 题目分析与理解
1.1 问题背景解析
这道题目描述了一个有趣的抽奖机制场景。dead_X拥有m张兑奖券,每张兑奖券有两种使用方式:
- 兑换成114514金币
- 兑换成一次抽奖机会
在抽奖中,dead_X会等概率获得n种道具中的一种体验卡(体验卡持续时间为1919810秒)。作为VIP用户,dead_X还有一个特殊权利:在所有抽奖结束后,可以选择一种抽到的体验卡类型,将所有该类型的体验卡上交,换取对应的永久道具。
1.2 问题形式化定义
题目最终转化为一个组合数学问题:对于所有长度∈[0,m],每个数∈[1,n]的整数序列,求其权值(不同元素个数+1)和对10^9+7取模的值。
举例说明:
- 序列[1,9,2,6,8,1,7]的不同元素是1,2,6,7,8,9共6个,所以权值为6+1=7
- 空序列的权值是0+1=1
1.3 输入输出要求
输入:
- 第一行是数据组数T
- 每组数据包含两个整数n和m
输出:
- 对每组数据,输出计算结果对10^9+7取模
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路分析
2.1 暴力解法思考
最直观的想法是枚举所有可能的序列并计算权值和。对于长度为k的序列:
- 序列总数:n^k
- 每个序列的权值等于其不同元素个数+1
但是这种方法在n和m较大时(如题目中的1e9)完全不可行,时间复杂度为O(m*n^m),显然会超时。
2.2 数学推导思路
我们需要找到一个数学公式,能够直接计算权值和而不需要枚举所有序列。观察权值的定义,可以将其拆解:
对于所有可能的序列,权值和 = Σ(序列的不同元素个数 + 1) = Σ(不同元素个数) + Σ(1)
其中:
- Σ(1)就是所有可能的序列总数
- Σ(不同元素个数)可以转化为对于每个元素,计算它在多少序列中至少出现一次
2.3 具体数学推导
-
总序列数计算:
对于k∈[0,m],长度为k的序列有n^k种
所以总序列数 = Σ_{k=0}^m n^k = (n^{m+1}-1)/(n-1) (当n≠1时) -
不同元素个数的期望:
对于每个特定的元素x,计算它在多少序列中至少出现一次
对于长度为k的序列:
- 不含x的序列数:(n-1)^k
- 至少含一个x的序列数:n^k - (n-1)^k
所以所有
