P4451
题目描述
题解
设斐波那契数列的生成函数为F(x)=∑fixiF(x)=\sum f_ix^iF(x)=∑fixi
那么答案G(x)G(x)G(x)的生成函数即为:
G(x)=∑i=0∞F(x)i=11−F(x)
G(x)=\sum\limits_{i=0}^{\infty}F(x)^i=\frac{1}{1-F(x)}\\
G(x)=i=0∑∞F(x)i=1−F(x)1
考虑怎么求出F(x)F(x)F(x),这里有一种普遍的方法:
fi=fi−1+fi−2+[n=1]F(x)=∑fixi=∑(fi−1+fi−2+[n=1])xiF(x)=∑fi−1xi+∑fi−2xi+x=xF(x)+x2F(x)+xF(x)=x1−x−x2
f_i=f_{i-1}+f_{i-2}+[n=1]\\
F(x)=\sum f_ix^i=\sum(f_{i-1}+f_{i-2}+[n=1])x^i\\
F(x)=\sum f_{i-1}x^i+\sum f_{i-2}x^i+x=xF(x)+x^2F(x)+x\\
F(x)=\frac{x}{1-x-x^2}
fi=fi−1+fi−2+[n=1]F(x)=∑fixi=∑(fi−1+fi−2+[n=1])xiF(x)=∑fi−1xi+∑fi−2xi+x=xF(x)+x2F(x)+xF(x)=1−x−x2x
那么G(x)G(x)G(x)为:
G(x)=x2+x−1x2+2x−1=1−xx2+2x−1
G(x)=\frac{x^2+x-1}{x^2+2x-1}=1-\frac{x}{x^2+2x-1}
G(x)=x2+2x−1x2+x−1=1−x2+2x−1x
由于nnn过大,不能直接求。
类似这样的问题的实质即是给定有理函数P(x)=Q(xR(x)P(x)=\frac{Q(x}{R(x)}P(x)=R(x)Q(x,求P(x)P(x)P(x)的某项系数,解决的方法通常有待定系数法和不同根的有理展开定理。
这里用待定系数法。
首先设:
x2+2x−1=(1−p1x)(1−p2x)
x^2+2x-1=(1-p_1x)(1-p_2x)
x2+2x−1=(1−p1x)(1−p2x)
解得p1,p2p_1,p_2p1,p2
再设:
xx2+2x−1=a1−p1x+b1−p2x
\frac{x}{x^2+2x-1}=\frac{a}{1-p_1x}+\frac{b}{1-p_2x}
x2+2x−1x=1−p1xa+1−p2xb
解得a,ba,ba,b
又因为:
[xn]a1−p1x=ap1n
[x^n]\frac{a}{1-p_1x}=ap_1^n
[xn]1−p1xa=ap1n
那么就可以得到xnx^nxn的系数了
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
int ksm(int a,int b){
int ans=1;
while(b){
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}return ans;
}
signed main(){
int re=0;char ch;
for(ch=getchar();isdigit(ch);ch=getchar()) re=re*10%(mod-1)+ch-'0';
re=re-1;
cout<<(1ll*485071604*ksm(1ll*940286408,re%(mod-1))%mod+1ll*514928404*ksm(1ll*59713601,re%(mod-1))%mod)%mod<<endl;
return 0;
}