多项式版子汇总(continue)

多项式全集

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool Finish_read;
template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;}
template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x%10+'0');}
template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('\n');}
template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);}
/*================Header Template==============*/
const int N=1e5+500;
vector<int>F,G;
int n,m;
/*==================Define Area================*/
namespace NTT {
    const int Md=998244353;
    inline int Add(const int &x,const int &y) {return (x+y)>=Md?(x+y-Md):(x+y);}
    inline int Sub(const int &x,const int &y) {return (x-y)<0?(x-y+Md):(x-y);}
    inline int Mul(const int &x,const int &y) {return (ll)x*y%Md;}
    int Powe(int x,int y) {
        int ans=1;
        while(y) {
            if(y&1) ans=Mul(ans,x);
            x=Mul(x,x);
            y>>=1;
        }
        return ans;
    }
    inline int Div(const int &x,const int &y) {return Mul(x,Powe(y,Md-2));}
    int rev[N<<2|1];
    vector<int>C;
    void DFT(vector<int>&A,int len) {
        for(int i=0;i<len;i++) if(i<rev[i]) swap(A[i],A[rev[i]]);
        for(int i=1;i<len;i<<=1) {
            int wn=Powe(3,(Md-1)/(i<<1));
            for(int j=0;j<len;j+=i<<1) {
                int nw=1,x,y;
                for(int k=0;k<i;k++,nw=Mul(nw,wn)) {
                    x=A[j+k],y=Mul(nw,A[i+j+k]);
                    A[j+k]=Add(x,y);A[i+j+k]=Sub(x,y);
                }
            } 
        }
    }
    void IDFT(vector<int>&A,int len) {
        reverse(A.begin()+1,A.end());
        int Inv=Powe(len,Md-2);
        DFT(A,len);
        for(int i=0;i<len;i++) A[i]=Mul(A[i],Inv);
    }
    vector<int> MUL(vector<int>A,vector<int>B) {
        int len,n=A.size(),m=B.size();
        for(len=1;len<n+m-1;len<<=1);
        A.resize(len),B.resize(len);
        for(int i=0;i<len;i++) rev[i]=(rev[i>>1]>>1)|((i&1)?(len>>1):0);
        DFT(A,len);DFT(B,len);
        for(int i=0;i<len;i++) A[i]=Mul(A[i],B[i]);
        IDFT(A,len);
        A.resize(n+m-1);
        return A;
    }
    void GetInv(int Deg,vector<int>&A,vector<int>&B) {
        if(Deg==1) {
            B[0]=Powe(A[0],Md-2);   
            return ;
        }
        GetInv((Deg+1)>>1,A,B);
        int len;
        for(len=1;len<(Deg<<1);len<<=1);
        for(int i=0;i<len;i++) rev[i]=(rev[i>>1]>>1)|((i&1)?(len>>1):0);
        B.resize(len);C.clear();C.resize(len);
        for(int i=0;i<Deg;i++) C[i]=A[i];
        for(int i=Deg;i<len;i++) C[i]=0;
        DFT(C,len);DFT(B,len);
        for(int i=0;i<len;i++) {
            B[i]=Mul(Sub(2,Mul(B[i],C[i])),B[i]);
        }
        IDFT(B,len);
        for(int i=Deg;i<len;i++) B[i]=0;
    }
}

int main() {

}

猜你喜欢

转载自www.cnblogs.com/Apocrypha/p/10279531.html