P4451-[国家集训队]整数的lqp拆分【生成函数,特征方程】
正題
題目鏈接:https://www.luogu.com.cn/problem/P4451
題目大意
給出nnn,對于所有滿足∑i=1mai=n\sum_{i=1}^ma_i=n∑i=1m?ai?=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∏m?Fbiai??
其中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=0n?Fbii?xi
那么有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?x2x?1?=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∞?ai?xi,那么答案就是
(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?1?xi
所以我們要求的第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?=c0?x0n?+c1?x1n?帶入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+2??c1?=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(log?n)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; }總結
以上是生活随笔為你收集整理的P4451-[国家集训队]整数的lqp拆分【生成函数,特征方程】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: YbtOJ#662-交通运输【线段树合并
- 下一篇: 4000元电脑配置推荐2021(4000