多项式全家桶(完善中)

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;
        }
    }
}
posted @ 2024-10-24 12:51  chx#XCPC  阅读(25)  评论(0)    收藏  举报