初识 Bostan-Mori 求解分式远处系数 | 题解:P4723 【模板】常系数齐次线性递推
SleeplessSouris · · 题解
文化课期末考不是很愿意想题,于是来搓点科技。进场之前想着学个 BM,看了一眼 hint 上下同乘一个
- 问题:求解
[x^k]\frac{P(x)}{Q(x)} 。其中P,Q 均为不超过n 次的多项式,k 很大。
给上下同乘一个
对
- 常系数齐次线性递推:有了 Bostan-Mori 算法,我们只要构造出合理的
P,Q 即可。分式远处求值和线性递推是可以互相转化的。
现在要构造
把
那么
当然有一种用特征多项式 + 多项式取模的经典做法可以做到相同复杂度,但是常数相对大很多(一轮只要两次卷积的优越性)。
ll Bostan_Mori(poly P,poly Q,ll n){// [x^n]P(x)/Q(x)
while(n){
poly _Q=Q;
for(int i=1;i<(int)Q.size();i+=2)_Q[i]=Mod-Q[i];
P=P*_Q,Q=Q*_Q;
int i=(n&1);
for(;i<(int)P.size();i+=2)P[i>>1]=P[i];
P.resize(i>>1);
for(i=0;i<(int)Q.size();i+=2)Q[i>>1]=Q[i];
Q.resize(i>>1),n>>=1;
}
if(!P.size())return 0;
return 1ll*P[0]*pw(Q[0],Mod-2)%Mod;
}
ll Recur(ll *f,ll *a,ll T,ll n){
poly Q;Q.resize(n+1),Q[0]=1;
rep(i,1,n)Q[i]=Mod-f[i];
poly R;R.resize(n);
rep(i,0,n-1)R[i]=a[i];
poly P=Q*R;P.resize(n);
return Bostan_Mori(P,Q,T);
}