板子应该没啥问题,求教dalao哪儿应该清空,清多长QAQ
#include<cstring>
#include<cstdio>
#define clr(f,len) memset(f,0,(len)<<3)
#define cpy(f,g,len) memcpy(f,g,(len)<<3)
typedef long long ll;
const ll mod=998244353ll,M=5e5+5;
ll n,m,fl,G=3,invG=332748118ll,t[M],f[M],inv[M];
void swap(ll&a,ll&b){
a^=b^=a^=b;
}
ll pow(ll a,ll b=mod-2){
ll ans=1;for(;b;b>>=1,a=a*a%mod)if(b&1)ans=ans*a%mod;
return ans;
}
void trpe(int len){
if(len==fl)return;fl=len;
for(int i=0;i<len;++i)t[i]=t[i>>1]>>1|(i&1?len>>1:0);
}
void px(ll*f,ll*g,int len){
for(int i=0;i<len;++i)f[i]=f[i]*g[i]%mod;
}
void dao(ll*f,int n){
for(int i=1;i<n;++i)f[i-1]=f[i]*i%mod;
f[n-1]=0;
}
void jifen(ll*f,int n){
for(int i=n;i;--i)f[i]=f[i-1]*inv[i]%mod;
f[0]=0;
}
void NTT(ll*f,bool flag,int n){
trpe(n);
int i,k,p,len;ll w,w1;
for(i=0;i<n;++i)if(i<t[i])swap(f[i],f[t[i]]);
for(p=2;p<=n;p<<=1){
len=p>>1;w1=pow(flag?G:invG,(mod-1)/p);
for(k=0;k<n;k+=p){
w=1;
for(i=k;i<k+len;++i){
ll t=f[i+len]*w%mod;
if((f[i+len]=f[i]-t)<0)f[i+len]+=mod;
if((f[i]=f[i]+t)>mod)f[i]-=mod;
w=w*w1%mod;
}
}
}
if(flag)return;
ll invn=pow(n);
for(i=0;i<n;++i)f[i]=f[i]*invn%mod;
}
void times(ll*f,ll*g,int l1,int l2){
static ll buf[M];
int n;
for(n=1;n<=(l1+l2);n<<=1);
cpy(buf,g,l2);
NTT(f,1,n);NTT(buf,1,n);
px(f,buf,n);NTT(f,0,n);
clr(buf,n);
}
void invp(ll*f,int m){
static ll b1[M],b2[M],b3[M];
int i,n,len;
for(n=1;n<m;n<<=1);b1[0]=pow(f[0]);
for(len=2;len<=n;len<<=1){
for(i=0;i<(len>>1);++i)b3[i]=(b1[i]<<1)%mod;
for(i=0;i<(len<<1);++i)t[i]=t[i>>1]>>1|(i&1?len:0);
cpy(b2,f,len);
NTT(b1,1,len<<1);px(b1,b1,len<<1);
NTT(b2,1,len<<1);px(b1,b2,len<<1);
NTT(b1,0,len<<1);clr(b1+len,len);
for(i=0;i<len;++i)b1[i]=(b3[i]-b1[i]+mod)%mod;
}
cpy(f,b1,m);clr(b1,n+n);clr(b2,n+n);clr(b3,n+n);
}
void lnp(ll*f,int m){
static ll g[M];int n;
for(n=1;n<m;n<<=1);
cpy(g,f,m);
invp(g,m);dao(f,m);
times(f,g,m,m);
jifen(f,m-1);
clr(f+m,m);clr(g,m);
}
void exp(ll*f,int m){
static ll b1[M],b2[M];int n,i,len;
for(n=1;n<m;n<<=1);b1[0]=1;
for(len=2;len<=n;len<<=1){
cpy(b2,b1,len>>1);lnp(b2,len);
for(i=0;i<len;++i)b2[i]=(f[i]-b2[i]+mod)%mod;
b2[0]=(b2[0]+1)%mod;
times(b1,b2,len,len);
}
cpy(f,b1,m);clr(b1,n+n);clr(b2,n+n);
}
signed main(void){
int i;
scanf("%lld",&n);inv[1]=1;
for(i=0;i<n;++i)scanf("%lld",f+i);
for(int i=2;i<=n;++i)inv[i]=(mod-mod/i)*inv[mod%i];
exp(f,n);
for(i=0;i<n;++i)printf("%lld ",f[i]);
}