Luogu4451 [国家集训队]整数的lqp拆分
题目链接:洛谷
题目大意:求对于所有$n$的拆分$a_i$,使得$\sum_{i=1}^ma_i=n$,$\prod_{i=1}^mf_{a_i}$之和。其中$f_i$为斐波那契数列的第$i$项。
数据范围:$n\leq 10^6$
首先不要被这个【国家集训队】给吓到了,其实很简单的。
首先考虑打表,。。。。(逃
显然一眼就能想到卷积,设$F(x)$为$f$的生成函数。则
$$F(x)=\frac{x}{1-x-x^2}$$
$$Ans=\sum_{i=0}^nF^i(x)[x^n]$$
$$=\frac{1}{1-\frac{x}{1-x-x^2}}[x^n]$$
$$=\frac{x}{1-2*x-x^2}[x^n]$$
根据直觉,这个多项式也是一个常系数齐次线性递推数列的生成函数,设为$G(x)$则
$$G(x)=2xG(x)+x^2G(x)+x$$
所以$g_{n+1}=2*g_n+g_{n-1}$
然后连矩阵乘法都不用就直接A了。
1 #include<cstdio> 2 #define Rint register int 3 using namespace std; 4 const int mod = 1e9 + 7; 5 int n, f1, f2, f3; 6 int main(){ 7 scanf("%d", &n); 8 f1 = 0; f2 = 1; 9 if(n == 1){puts("1"); return 0;} 10 for(Rint i = 2;i <= n;i ++){ 11 f3 = (2ll * f2 + f1) % mod; 12 f1 = f2; f2 = f3; 13 } 14 printf("%d", f3); 15 }