设我们要求的是(g_n)
我们强行定义(g_0=1)
于是就有
[g_i=sum_{j=0}^{i-1}fib_{j}g_{i-j}
]
就是新枚举一个(j),通过一个分配率和在原来的答案上更进一步
于是这个数列的生成函数就是
[egin{aligned} G(x)=&sum_{i=0}(sum_{j=0}^{i-1}fib_jg_{i-j}+[i=0])x^i\&=1+sum_{i=0}(sum_{j=0}^{i-1}fib_jg_{i-j})x^i\&=1+sum_{i=0}sum_{j=0}^{i-1}fib_{j}x_j imes g_{i-j}x^{i-j}end{aligned}
]
发现里面是(fib)的生成函数卷上(G(x))
设
[F(x)=sum_{i=0}fib_ix^i=frac{x}{1-x-x^2}
]
于是就有
[G(x)=1+G(x)F(x)
]
解得
[G(x)=frac{1-x-x^2}{1-2x-x^2}=frac{1-2x-x^2+x}{1-2x-x^2}=1+frac{x}{1-2x-x^2}
]
发现多出来的那个常数项是我们强行使得(g_0=1)的结果,不管它就好了
强行处理后面的(frac{x}{1-2x-x^2})
我们发现分母上可以被因式分解一下
[frac{x}{1-2x-x^2}=frac{x}{(1-(1-sqrt{2})x)(1-(1+sqrt{2})x)}
]
你说怎么搞这个因式分解,你把(1-sqrt{2})设成(frac{apmsqrt{b}}{c})的形式
就会发现
[frac{a+sqrt{b}}{c} imes frac{a-sqrt{b}}{c}=frac{a^b-b}{c^2}=-1
]
[-(frac{a+sqrt{b}}{c}+ frac{a-sqrt{b}}{c})=-2
]
根据下面那个式子我们可以发现(a=c)
于是上面那个式子就是(2a^2-b=0),我们发现只需要使得(a=1,b=2)就可以了
于是我们就又需要来拆掉这个式子
至于这个如何去拆,我们可以继续列方程
设上面那个式子等于
[egin{aligned}&frac{a}{1-(1-sqrt{2})x}+frac{b}{1-(1+sqrt{2})x}\&=frac{a(1-(1+sqrt{2})x)+b(1-(1-sqrt{2})x)}{(1-(1-sqrt{2})x)(1-(1+sqrt{2})x)}\&=frac{a-ax-asqrt{2}x+b-bx+bsqrt{2}x}{(1-(1-sqrt{2})x)(1-(1+sqrt{2})x)}end{aligned}
]
我们知道上面那一大坨东西应该等于(x)
于是
[a-ax-asqrt{2}x+b-bx+bsqrt{2}x=x
]
由于没有常数项,于是(a=-b)
也就有
[-asqrt{2}x+bsqrt{2}x=x
]
解得(a=-frac{1}{2sqrt{2}},b=frac{1}{2sqrt{2}}),我们(a,b)放到外面就好了
可以拆成
[-frac{sqrt{2}}{4} imesfrac{1}{1-(1-sqrt{2})x}+frac{sqrt{2}}{4} imes frac{1}{1-(1+sqrt{2})x}
]
发现有两个诸如(frac{1}{1-cx})的生成函数,这就是一个公比为(c)的等比数列
于是我们就可以推出通项
[g_n=-frac{sqrt{2}}{4} imes (1-sqrt{2})^n+frac{sqrt{2}}{4} imes(1+sqrt{2})^n
]
由于我比较菜,不会二次剩余,可以写个暴力求一下(x^2 equiv 2(mod 1e9+7)),发现(x=59713600)
根据通项就可以求了,就是一个快速幂的事
#include<cstdio>
#define LL long long
const LL mod=1e9+7;
const LL Sqr=59713600;
const LL Inv=250000002;
LL n;
inline LL ksm(LL a,LL b) {LL S=1;while(b) {if(b&1) S=S*a%mod;b>>=1;a=a*a%mod;}return S;}
int main() {
scanf("%lld",&n);
printf("%lld
",((ksm(1+Sqr,n)*Sqr%mod*Inv%mod-ksm(1-Sqr+mod,n)*Sqr%mod*Inv)%mod+mod)%mod);
}