调了一天了,帮一帮我叭
查看原帖
调了一天了,帮一帮我叭
55650
flowerletter楼主2019/5/15 22:19

样例Wa

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define G 3
const int MAXN = (4e5)+10;
const int Mod = 998244353;
int n,a[MAXN],b[MAXN],c[MAXN],d[MAXN],x[MAXN],y[MAXN],f[MAXN],g[MAXN],in[MAXN],out[MAXN],rev[MAXN];
inline int Get_Init(int n,int lim=1,int k=0){
    while(lim<=n) lim<<=1,k++;
    for(int i=1;i<lim;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<k-1);
    return lim;
}
inline int Pow(int a,int b,int ans=1){
    for(;b;b>>=1,a=a*a%Mod) if(b&1) ans=ans*a%Mod;
    return ans;
}
inline void NTT(int *a,int lim,int type){
    for(int i=0;i<lim;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
    for(int i=1;i<lim;i<<=1){
        int wn=Pow(G,(Mod-1)/(i<<1));
        if(type==-1) wn=Pow(wn,Mod-2);
        for(int j=0;j<lim;j+=(i<<1)){
            int w=1;
            for(int k=0;k<i;k++,w=w*wn%Mod){
                int x=a[k+j],y=w*a[k+j+i];
                a[k+j]=(x+y)%Mod,a[k+j+i]=((x-y)%Mod+Mod)%Mod;
            }
        }
    }if(type==-1){
        int inv=Pow(lim,Mod-2);
        for(int i=0;i<lim;i++) a[i]=a[i]*inv%Mod;
    }
}
inline void Get_Inv(int *a,int *b,int len){
    if(len==1){b[0]=Pow(a[0],Mod-2);return ;}
    Get_Inv(a,b,len>>1);int lim=Get_Init(len);
    for(int i=0;i<len;i++) x[i]=a[i],y[i]=b[i];
    for(int i=len;i<lim;i++) x[i]=y[i]=0;
    NTT(x,lim,1),NTT(y,lim,1);
    for(int i=0;i<lim;i++) x[i]=x[i]*y[i]%Mod*y[i]%Mod;
    NTT(x,lim,-1);for(int i=0;i<len;i++) b[i]=(2*b[i]%Mod-x[i]+Mod)%Mod;
}
inline void Get_Direv(int *a,int *b,int lim){
    for(int i=1;i<lim;i++) b[i-1]=a[i]*i%Mod;b[lim-1]=0;
}
inline void Get_Inter(int *a,int *b,int lim){
    for(int i=1;i<lim;i++) b[i]=a[i-1]*Pow(i,Mod-2)%Mod,b[0]=0;
}
inline void Get_Ln(int *a,int *b,int len){
    Get_Direv(a,f,len),Get_Inv(a,g,len);int lim=Get_Init(len); 
    NTT(f,lim,1),NTT(g,lim,1);
    for(int i=0;i<lim;i++) f[i]=f[i]*g[i]%Mod;
    NTT(f,lim,-1),Get_Inter(f,b,len);
}
inline void Get_Exp(int *a,int *b,int len){
    if(len==1){b[0]=1;return ;}
    Get_Exp(a,b,len>>1),Get_Ln(b,c,len);
    for(int i=0;i<len;i++) c[i]=(a[i]-c[i]+Mod)%Mod;c[0]++;
    int lim=Get_Init(len);NTT(c,lim,1),NTT(b,lim,1);
    for(int i=0;i<lim;i++) b[i]=b[i]*c[i]%Mod;
    NTT(b,lim,-1);for(int i=len;i<lim;i++) b[i]=0;
}
signed main(){
    scanf("%lld",&n);
    for(int i=0;i<n;i++) scanf("%lld",&in[i]);
    Get_Exp(in,out,Get_Init(n));
    for(int i=0;i<n;i++) printf("%lld ",out[i]);
    return 0;
}
2019/5/15 22:19
加载中...