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;ilen;++i){
cir[i]=(cir[i1]1)((i&1)len10);
if(icir[i])swap(f[i],f[cir[i]]);
}
for(int l=2;l=len;l=1){
int w=qpow(tGiG,(mo-1)l);
for(int i=0;ilen;i+=l){
int fw=1,u,v;
for(int j=i;ji+l2;++j,fw=fww%mo){
u=f[j],v=f[j+l2];
f[j]=(u+fwv%mo)%mo;
f[j+l2]=(u+mo-fwv%mo)%mo;
}
}
}
int r=qpow(len,mo-2);
for(int i=0;(!t)&&ilen;++i)f[i]=f[i]r%mo;
}
void polymul(int f,int g,int len){
for(int i=0;ilen;++i)f[i]=f[i]g[i]%mo;
}
void polycpy(int f,int g,int len){g - f
for(int i=0;ilen;++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,l2);
polycpy(sav,f,l);
fft(w,l2,1),fft(sav,l2,1);
polymul(w,w,l2);
polymul(w,sav,l2);
fft(w,l2,0);
for(int i=0;il;++i){
w[i]=(2r[i]+mo-w[i])%mo;
w[i+l]=0;
}
}
polycpy(f,w,len);
for(int i=0;ilen2;++i){
sav[i]=w[i]=r[i]=0;
}
}
}
学习笔记 · 2026-07-31