Luogu4451 [国家集训队]整数的lqp拆分

题目链接:洛谷

题目大意:求对于所有$n$的拆分$a_i$,使得$\sum_{i=1}^ma_i=n$,$\sum_{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 }
View Code

猜你喜欢

转载自www.cnblogs.com/AThousandMoons/p/10623651.html
今日推荐