随便说说的题

280 篇文章 1 订阅
220 篇文章 2 订阅

题目

题目描述
兔子,兔子,和很多新的兔子。

一只兔子每天会生下 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 1k 。因为兔子不可能无限制繁殖,所以 k ≤ 1 0 9 k\le 10^9 k109

因为兔子窝太多,苏苏也忙活不过来,所以 T ≤ 1 0 6 T\le 10^6 T106

因为兔子数量太多,苏苏就数不清了,所以他只会告诉你 n i ≤ 1 0 6 n_i\le 10^6 ni106 的兔子窝。

思路

看上去题目那么长,其实就是道简单的背包题 😂

因为 x ( x ≥ 0 ) x(x\ge 0) x(x0) 天前来到的兔子,到今天就已经变成了 ( 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 x0

所以我们写出方程式

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(n1)+[k+1nZ]f(k+1n)

复杂度 O ( n + T ) \mathcal O(n+T) O(n+T)可惜这是口胡的题,完全没有题目和数据和标程呢。

后记

思路来源于其简化版本,即 k = 1 k=1 k=1 的情况。传送门 to usOJ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值