[國家集訓隊] 整數的lqp拆分
阿新 • • 發佈:2018-04-19
its for 遞推 print light scanf solution div main
題面:https://www.luogu.org/problemnew/show/P4451
題解鏈接:https://www.luogu.org/problemnew/solution/P4451
題解見代碼註釋 (或者我回來會放我在洛谷上寫的題解)
/* 設 g[i] 為i的lqp拆分的權值和,則 g[i] = ∑f[j] * g[i-j] + f[i],其中 g[0] = 0, g[1] = 1. 以前是推式子推出來結果的,那麽今天就嘗試用生成函數做一下: 設 A = ∑f[i] * x^i , B = ∑g[i] * x^i ,那麽 => B = A*B + A. 解一下 B ,發現 B = A/(1-A); 又∵ A的閉形式是 x/(1 - x - x^2) [斐波那契數的生成函數閉形式]. ∴ B = x/(1 - 2x - x^2) ,於是直接由B的特征根 得出g[]的遞推式 => g[i] = 2*g[i-1] + g[i-2]. (生成函數太好用了2333) */ #include<bits/stdc++.h> #define ll long long using namespace std; const int ha=1000000007; const int maxn=1000005; inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x;} int main(){ int n,P=0,p=1,now=1; scanf("%d",&n); for(int i=2;i<=n;i++,P=p,p=now) now=add(add(p,p),P); printf("%d\n",now); return 0; }
[國家集訓隊] 整數的lqp拆分