LGP4451题解

题意明确,不再阐述(

首先,众所周知的是 斐波那契数列 的生成函数是 \(F(x)=\frac x {1-x-x^2}\)

那么答案就是 \(\sum_{i=0} F^i(x) = \frac 1 {1-F(x)} = \frac {1-x-x^2} {1-2x-x^2}\) 的第 \(n\) 项。

首先我们把分子和分母分开考虑,因为如果知道了分母所代表的生成函数的第 \(n\) 项,答案就很明显了。。。

尝试把 \(\frac 1 {1-2x-x^2}\) 分解成 \(\frac A {1-ax} - \frac B {1-bx}\) 的形式。

\(-x^2 -2x +1 =0\) 这个方程,得到 \(x_1 = -1 + \sqrt 2\)\(x_2 = -1 - \sqrt 2\)

根据因式定理可得:

\[1 -2x -x^2 = (-1)(-1 + \sqrt 2 -x)(-1 - \sqrt2 -x) \]

\[\frac 1 {1 -2x -x^2} = - \frac 1 {(-1 +\sqrt 2 -x)(-1 -\sqrt 2 -x)} \]

然后我们发现 \(\frac 1 {-1 -\sqrt 2 -x} - \frac 1 {-1 +\sqrt 2 -x} = \frac {2\sqrt 2} {(-1 +\sqrt 2 -x)(-1 -\sqrt 2 -x)}\)
那么:

\[\frac 1 {1 -2x -x^2} = (\frac 1 {-1 +\sqrt 2 -x} - \frac 1 {-1 -\sqrt 2 -x})\frac 1 {2\sqrt 2} \]

看一下括号里边的东西,我们知道 \(\frac 1 {a - x} = \frac {\frac 1 a} {1 - \frac 1 a x}\),然后括号里变成了这样:

\[\frac {1 + \sqrt 2} {1 - (1 + \sqrt 2)x} - \frac {1 - \sqrt 2} {1 - (1 - \sqrt 2)x} \]

显然,第 \(n\) 项为 \((1 +\sqrt 2)^{n+1} - (1 -\sqrt 2)^{n+1}\)

乘上右边的 $\frac 1 {2\sqrt 2} $ 和 $ 1 -x -x^2$,答案就是:

\[\frac 1 {2\sqrt 2}((1 +\sqrt 2)^{n+1} + (1 +\sqrt 2)^n + (1 +\sqrt 2)^{n-1} - ((1 -\sqrt 2)^{n+1} + (1 -\sqrt 2)^n + (1 -\sqrt 2)^{n-1})) \]

化简可得:

\[ans = \frac {\sqrt 2} 4((1 +\sqrt2)^n - (1 -\sqrt 2)^n) \]

然后我们用二次剩余可知:

\[59713600 \equiv \sqrt 2 \pmod {10^9+7} \]

那么就可以 \(O(\log mod)\) 愉快地做掉了。

代码:

#include<cctype>
#include<cstdio>
const int mod=1e9+7,MOD=mod-1,sqrt2=59713600ll;
inline int Add(const int&a,const int&b){
	return a+b>=mod?a+b-mod:a+b;
}
inline int Del(const int&a,const int&b){
	return a-b<0?a-b+mod:a-b;
}
inline int pow(int a,int b){
	int ans=1;
	for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*ans*a%mod;
	return ans;
}
signed main(){
	char s=getchar();int n=0;
	while(n=(n*10ll+(48^s))%MOD,s=getchar(),s>=48&&s<=58);
	printf("%d",1ll*sqrt2*pow(4,mod-2)%mod*Del(pow(Add(1,sqrt2),n),pow(Del(1,sqrt2),n))%mod);
}
posted @ 2022-01-10 15:59  Prean  阅读(13)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};