见这里
可以求出两个多项式相乘结果系数对任意NTT模数(可以表示为\(a\times2^b+1\)形式的质数)取模的结果。
其实只要把FFT里的单位副根变为该模数的原根就好了。
常见的NTT模数为998244353,原根为3。
code:
void NTT(vector<int>&f,ci l,ci len,ci op){
if(len&1)return;
for(int i=l;i<l+len;++i)cpy[i]=f[i];
int nw=l-1,ln=len>>1;
for(int i=l;i<l+ln;++i)f[i]=cpy[++nw],f[i+ln]=cpy[++nw];
NTT(f,l,ln,op),NTT(f,l+ln,ln,op);
int rt=POW(g,(mod-1)/len),t;
op?rt=POW(rt,mod-2):0;
nw=1;
for(int i=l;i<l+len;++i)cpy[i]=f[i];
for(int i=l;i<l+ln;++i,nw=1ll*nw*rt%mod)t=1ll*nw*cpy[i+ln]%mod,f[i]=(cpy[i]+t)%mod,f[i+ln]=(cpy[i]-t+mod)%mod;
}
见这里
剩下的待更新...
原文:https://www.cnblogs.com/xryjr233/p/10592862.html