正题
题目链接:https://www.luogu.com.cn/problem/P4451
题目大意
给出nnn,对于所有满足∑i=1mai=n\sum_{i=1}^ma_i=n∑i=1mai=n且∀ai∈N+\forall a_i\in N^+∀ai∈N+的序列求
∑m=1∞∏i=1mFbiai\sum_{m=1}^{\infty}\prod_{i=1}^mFbi_{a_i}m=1∑∞i=1∏mFbiai
其中FbixFbi_xFbix表示第xxx个斐波那契数
1≤n≤101041\leq n\leq 10^{10^4}1≤n≤10104
解题思路
因为刚学特征方程所以推的都会写下来,比较冗长
首先考虑斐波那契的生成函数F(x)=∑i=0nFbiixiF(x)=\sum_{i=0}^nFbi_ix^iF(x)=∑i=0nFbiixi
那么有F(x)=x2F(x)+xF(x)+xF(x)=x^2F(x)+xF(x)+xF(x)=x2F(x)+xF(x)+x,可以解得F(x)=x1−x−x2F(x)=\frac{x}{1-x-x^2}F(x)=1−x−x2x。
然后答案就是
∑i=0∞F(x)i=11−F(x)=11−x1−x−x2=1−x−x21−2x−x2\sum_{i=0}^{\infty}F(x)^i=\frac{1}{1-F(x)}=\frac{1}{1-\frac{x}{1-x-x^2}}=\frac{1-x-x^2}{1-2x-x^2}i=0∑∞F(x)i=1−F(x)1=1−1−x−x2x1=1−2x−x21−x−x2
然后11−2x−x2\frac{1}{1-2x-x^2}1−2x−x21是一个特征方程为1−2x−x21-2x-x^21−2x−x2的递推式,也就是an=2an−1+an−2a_n=2a_{n-1}+a_{n-2}an=2an−1+an−2。
然后G(x)=∑i=0∞aixiG(x)=\sum_{i=0}^{\infty}a_ix^iG(x)=∑i=0∞aixi,那么答案就是
(1−x−x2)G(x)=∑i=0∞(ai−ai−1−ai−2)xi=∑i=0∞ai−1xi(1-x-x^2)G(x)=\sum_{i=0}^{\infty}(a_i-a_{i-1}-a_{i-2})x^i=\sum_{i=0}^\infty a_{i-1}x^i(1−x−x2)G(x)=i=0∑∞(ai−ai−1−ai−2)xi=i=0∑∞ai−1xi
所以我们要求的第nnn项就是an−1a_{n-1}an−1
用特征方程化前面那个递推式了,解出1−2x−x2=01-2x-x^2=01−2x−x2=0有x0=2+1,x1=−2+1x_0=\sqrt 2+1,x_1=-\sqrt 2+1x0=2+1,x1=−2+1
然后设an=c0x0n+c1x1na_n=c_0x_0^n+c_1x_1^nan=c0x0n+c1x1n带入a0=1a_0=1a0=1和a1=2a_1=2a1=2有方程
{c0+c1=1c0(2+1)+c1(−2+1)=2\left\{\begin{matrix}c_0+c_1=1\\c_0(\sqrt2+1)+c_1(-\sqrt 2+1)=2\end{matrix}\right.{c0+c1=1c0(2+1)+c1(−2+1)=2
解出来就是
{c0=2+24c1=2−24\left\{\begin{matrix}c_0=\frac{2+\sqrt 2}{4}\\c_1=\frac{2-\sqrt 2}{4}\end{matrix}\right.{c0=42+2c1=42−2
然后我们就有
an=2+24(2+1)n+2−24(−2+1)na_n=\frac{2+\sqrt 2}{4}(\sqrt 2+1)^n+\frac{2-\sqrt 2}{4}(-\sqrt 2+1)^nan=42+2(2+1)n+42−2(−2+1)n
然后二次剩余跑出来在模109+710^9+7109+7下2=59713600\sqrt 2=597136002=59713600带进去做就好了。
时间复杂度O(logn)O(\log n)O(logn)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll g2=59713600,P=1e9+7;
char s[11000];ll n;
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
signed main()
{scanf("%s",s+1);n=strlen(s+1);ll p=0;for(ll i=1;i<=n;i++)p=(p*10+s[i]-'0')%(P-1);ll inv=(P+1)/4;ll c1=(2-g2+P)%P*inv%P,c2=(2+g2)*inv%P;ll t1=c1*power(P-g2+1,p)%P*power(P-g2+1,P-2)%P;ll t2=c2*power(g2+1,p)%P*power(g2+1,P-2)%P;printf("%lld\n",(t1+t2)%P);return 0;
}