namespace Polynomial{
const int N=2e6+5,G=3,iG=332748118;
int cir[N],w[N],r[N],sav[N];
void fft(int *f,int len,int t){
for(int i=0;i<len;++i){
cir[i]=(cir[i>>1]>>1)|((i&1)?len>>1:0);
if(i>cir[i])swap(f[i],f[cir[i]]);
}
for(int l=2;l<=len;l<<=1){
int w=qpow(t?G:iG,(mo-1)/l);
for(int i=0;i<len;i+=l){
int fw=1,u,v;
for(int j=i;j<i+l/2;++j,fw=fw*w%mo){
u=f[j],v=f[j+l/2];
f[j]=(u+fw*v%mo)%mo;
f[j+l/2]=(u+mo-fw*v%mo)%mo;
}
}
}
int r=qpow(len,mo-2);
for(int i=0;(!t)&&i<len;++i)f[i]=f[i]*r%mo;
}
void polymul(int *f,int *g,int len){
for(int i=0;i<len;++i)f[i]=f[i]*g[i]%mo;
}
void polycpy(int *f,int *g,int len){//g -> f
for(int i=0;i<len;++i)f[i]=g[i];
}
void polyinv(int *f,int len){
w[0]=qpow(f[0],mo-2);
for(int l=2;l<=len;l<<=1){
polycpy(r,w,l/2);
polycpy(sav,f,l);
fft(w,l*2,1),fft(sav,l*2,1);
polymul(w,w,l*2);
polymul(w,sav,l*2);
fft(w,l*2,0);
for(int i=0;i<l;++i){
w[i]=(2*r[i]+mo-w[i])%mo;
w[i+l]=0;
}
}
polycpy(f,w,len);
for(int i=0;i<len*2;++i){
sav[i]=w[i]=r[i]=0;
}
}
}
标签:完善,const,int,多项式,全家,len,cir
From: https://www.cnblogs.com/chenhx-xcpc/p/18499372