多项式全家桶

#include
#include
#include
#include
#define mod 998244353
using namespace std;
int n,a[600100],b[600100],ina[600100],lna[600100],lnc[600100],sqa[600100],sqb[600100],exa[600100],exb[600100],poa[600100],pob[600100],pos[600100];
int read()
{
    int aa=0,bb=1;char cc=getchar();
    while(cc>'9'||cc<'0'){if(cc=='-') bb=-1;cc=getchar();}
    while(cc>='0'&&cc<='9'){aa=(aa<<3)+(aa<<1)+(cc^'0');cc=getchar();}
    return aa*bb;
}
int quick(int x,int p)
{
    int as=1;
    while(p){
        if(p&1) as=1ll*as*x%mod;
        x=1ll*x*x%mod;p>>=1;
    }
    return as;
}
void ntt(int *a,int len,int opt)
{
    for(int i=0;iif(i<pos[i]) swap(a[i],a[pos[i]]);
    for(int i=1;i1){
        int step=i<<1,wn=quick(3,(mod-1)/step);
        for(int j=0;jstep){
            int w=1;
            for(int k=0;kmod){
                int x=a[j+k],y=1ll*a[j+k+i]*w%mod;
                a[j+k]=(x+y)%mod;a[j+k+i]=(x-y+mod)%mod;
            }
        }
    }
    if(opt){
        reverse(a+1,a+len);int inv=quick(len,mod-2);
        for(int i=0;imod;
    }
}
void getderiv(int n,int *a,int *b)
{
    for(int i=1;i1]=1ll*a[i]*i%mod;
    b[n-1]=0;
}
void getinteg(int n,int *a,int *b)
{
    for(int i=1;i1]*quick(i,mod-2)%mod;
    b[0]=0;
}
void getinv(int n,int *a,int *b)
{
    if(n==1){b[0]=quick(a[0],mod-2);return;}
    getinv((n+1)>>1,a,b);
    int lenth=1,bit=0;
    while(lenth<=n+n+n) lenth<<=1,bit++;
    for(int i=0;i>1]>>1)|((i&1)<1);
    for(int i=0;ia[i];
    for(int i=n;i0;
    ntt(ina,lenth,0);ntt(b,lenth,0);
    for(int i=0;imod;
    ntt(b,lenth,1);
    for(int i=n;i0;
}
void getln(int n,int *a,int *b)
{
    getderiv(n,a,lna);
    getinv(n,a,lnc);
    int lenth=1,bit=0;
    while(lenth<=n+n) lenth<<=1,bit++;
    for(int i=0;i>1]>>1)|((i&1)<1);
    ntt(lna,lenth,0);ntt(lnc,lenth,0);
    for(int i=0;imod;
    ntt(lna,lenth,1);getinteg(n,lna,b);
    for(int i=0;i0,lnc[i]=0;
}
void getsqrt(int n,int *a,int *b)
{
    if(n==1){b[0]=1;return;}
    getsqrt((n+1)>>1,a,b);
    getinv(n,b,sqb);
    int lenth=1,bit=0;
    while(lenth<=n+n+n) lenth<<=1,bit++;
    for(int i=0;i>1]>>1)|((i&1)<1);
    for(int i=0;ia[i];
    for(int i=n;i0;
    ntt(b,lenth,0);ntt(sqa,lenth,0);ntt(sqb,lenth,0);int inv=quick(2,mod-2);
    for(int i=0;imod;
    ntt(b,lenth,1);
    for(int i=n;i0;
    for(int i=0;i0;
}
void getexp(int n,int *a,int *b)
{
    if(n==1){b[0]=1;return;}
    getexp((n+1)>>1,a,b);
    getln(n,b,exb);
    int lenth=1,bit=0;
    while(lenth<=n+n) lenth<<=1,bit++;
    for(int i=1;i>1]>>1)|((i&1)<1);
    for(int i=0;i0]++;
    for(int i=n;i0;
    ntt(exb,lenth,0);ntt(b,lenth,0);
    for(int i=0;imod;
    ntt(b,lenth,1);
    for(int i=n;i0;
}
void getpow(int n,int *a,int *b,int k)
{
    getln(n,a,poa);
    for(int i=0;imod;
    getexp(n,pob,b);
    int lenth=1,bit=0;
    while(lenth<=n) lenth<<=1,bit++;
    for(int i=n;i0;
    for(int i=0;i0,pob[i]=0;
}
int main()
{
    n=read();
    for(int i=0;iread();
    getsqrt(n,a,b);
    for(int i=0;i"%d ",b[i]);
    return 0;
}

 

啥都不会只会板子(现在连板子都不会了

你可能感兴趣的:(多项式全家桶)