题解:P5808 【模板】常系数非齐次线性递推
ZhongYuLin · · 题解
考虑延用齐次时的做法。设
故我们要对
容易依题意列出
可以多项式多点求值以后参照【模板】分治 FFT,快速求出前
然而,现在是
遗憾的是,笔者的多项式板子过于烂,导致取模时就已经超时,而笔者忙于学业,无暇改进多项式板子并实现暴力卡常做法。下面给出并不能通过的主函数,来进一步阐释上文。记录。
int main(){
int n,m,K;
cin>>n>>m>>K;++m;
poly f(K),p(m),a(K+m);
for(int i=0;i<K;++i)cin>>a[i];
for(auto &x:f)cin>>x;
for(auto &x:p)cin>>x;
poly A=f,B(m+1);
reverse(A.begin(),A.end());
A.push_back(P-1);
B[0]=1;
for(int i=1;i<=m;++i)B[i]=B[i-1]*fp(i)%P*(P-1)%P*(m-i+1)%P;
A=A*B;
poly now={0,1},cf={1};
for(;n;n>>=1,now=now*now%A)
if(n&1)cf=cf*now%A;
for(int j=K;j<K+m;++j){
ll sum=calc(p,j);//求多项式 p 在 j 处的点值
for(int i=1;i<=K;++i)
sum=(sum+f[i-1]*a[j-i])%P;
a[j]=sum;
}
ll ans=0;
for(int i=0;i<m+K;++i)ans=(ans+cf[i]*a[i])%P;
printf("%lld\n",ans);
return 0;
}