51nod1196 字符串的数量

用N个不同的字符(编号1 - N),组成一个字符串,有如下要求:
(1) 对于编号为i的字符,如果2 * i > n,则该字符可以作为结尾字符。如果不作为结尾字符而是中间的字符,则该字符后面可以接任意字符。
(2) 对于编号为i的字符,如果2 * i <= n,则该字符不可以作为结尾字符。作为中间字符,那么后面接的字符编号一定要 >= 2 * i。
问有多少长度为M且符合条件的字符串,由于数据很大,只需要输出该数Mod 10^9 + 7的结果。
例如:N = 2,M = 3。则abb, bab, bbb是符合条件的字符串,剩下的均为不符合条件的字符串。
Input
输入2个数,N, M中间用空格分割,N为不同字符的数量,M为字符串的长度。(2 <= N, M <= 10^6)
Output
输出符合条件的字符串的数量。由于数据很大,只需要输出该数Mod 10^9 + 7的结果。
Input示例
6 3
Output示例
73

记得这道题在长沙的时候曾经rand到过(就是无聊的时候在51nod上rand题做)。

然后清楚记得当时做不起,开题解大概懂了并没有打。

由于N比较大,基本上搞不成什么东西,所以只能在字符串的要求上下手。

我们发现有一个比较让人着迷的地方就是对于一个编号为i的字符如果2*i<=n,那么后面接的字符编号一定要>=2*i

也就是说,当2*i<=n的时候i会成迅速增长,一直到2*i>n。

那么我们可以发现两个2*i>n的i中间夹的2*i<=n的数量不超过20个。

所以可以考虑提前预处理出中间夹x个的方案数,然后直接用矩阵快速幂搞。

原文地址:https://www.cnblogs.com/Serene-shixinyi/p/8099530.html