题目
题目描述
兔子,兔子,和很多新的兔子。
一只兔子每天会生下 k k k 只兔子。生下来的小兔子,从第二天开始就会变成大兔子,并且生产。
举例, k = 1 k=1 k=1 时,兔子数量在前三天分别是: 1 1 1 只兔子; 1 1 1 只大兔、 1 1 1 只小兔; 2 2 2 只大兔、 2 2 2 只小兔。
现在苏苏正在研究这群兔子。他发现一些兔子窝。有 n i n_i ni 只兔子的窝。他在想,所有兔子肯定都是从外面到来的,然后不再离开,并在这个窝里继续繁殖。有多少种不同的情况呢?
两种情况不同,当且仅当某一天到来的兔子数量不同。可以认为时间轴无限长。
举例, n i = 5 n_i=5 ni=5 而 k = 1 k=1 k=1 时,可能是:前天来了一只兔子,今天来了一只兔子;昨天来了两只兔子,今天来了一只兔子;今天来了五只兔子。
输入格式
第一行两个整数
k
,
T
k,T
k,T ,分别表示兔子的生育能力,兔子窝的数量。
接下来 T T T 行,每行一个整数 n i n_i ni ,表示这个兔子窝的数量。
输出格式
共
T
T
T 行,每行一个整数,表示不同的兔子到来情况的数量,输出时取模
1
0
9
+
7
10^9+7
109+7 。
数据范围与提示
因为兔子不能断子绝孙,所以
1
≤
k
1\le k
1≤k 。因为兔子不可能无限制繁殖,所以
k
≤
1
0
9
k\le 10^9
k≤109 。
因为兔子窝太多,苏苏也忙活不过来,所以 T ≤ 1 0 6 T\le 10^6 T≤106 。
因为兔子数量太多,苏苏就数不清了,所以他只会告诉你 n i ≤ 1 0 6 n_i\le 10^6 ni≤106 的兔子窝。
思路
看上去题目那么长,其实就是道简单的背包题 😂
因为 x ( x ≥ 0 ) x(x\ge 0) x(x≥0) 天前来到的兔子,到今天就已经变成了 ( k + 1 ) x (k+1)^x (k+1)x 只。问题转变为,求将 n n n 分解为 ( k + 1 ) (k+1) (k+1) 的幂作和,方案数几何。
考虑 d p \tt dp dp ,用 f ( n ) f(n) f(n) 表示方案数。怎么转移呀?
这里有绝妙的一笔。分成两种情况,今天是否有兔子到来,也就是 1 1 1 的数量是否为零。如果没有 1 1 1 了,那剩下的必须用 ( k + 1 ) x (k+1)^x (k+1)x 凑出,其中 x > 0 x>0 x>0 。能不能转化成子问题?我们将其全部除以 k + 1 k+1 k+1 即可!就会使得 x x x 减小 1 1 1 ,回到原来的范围 x ≥ 0 x\ge 0 x≥0 。
所以我们写出方程式
f ( n ) = f ( n − 1 ) + [ n k + 1 ∈ Z ] f ( n k + 1 ) f(n)=f(n-1)+\left[\frac{n}{k+1}\in\Z\right]f\left(\frac{n}{k+1}\right) f(n)=f(n−1)+[k+1n∈Z]f(k+1n)
复杂度
O
(
n
+
T
)
\mathcal O(n+T)
O(n+T) 。可惜这是口胡的题,完全没有题目和数据和标程呢。
后记
思路来源于其简化版本,即 k = 1 k=1 k=1 的情况。传送门 to usOJ。