学习笔记 · 2026-07-31

多项式全家桶(完善中)

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;
        }
    }
}