菜鸡写 exp 写自闭了,经检验除了代码中 Exp 函数外 其他代码可以通过多项式 Ln 的模板。
唯独不太清楚 Exp 函数为什么挂了……
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=310000;
const int mod=998244353;
int rev[N],a[N],b[N],c[N],d[N],e[N],f[N],g[N];
int lnb[N],G[N],n,k[N];
inline int add(int x,int y){return (x+y)%mod;}
inline int mul(int x,int y){return 1ll*x*y%mod;}
inline int qpow(int a,int b){
int res=1;
while(b){
if(b&1)res=mul(res,a);
a=mul(a,a);b>>=1;
}
return res;
}
void NTT(int *A,int lim,int tp){
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 gn=qpow(3,(mod-1)/(i<<1));
if(tp!=1)gn=qpow(gn,mod-2);
for(int j=0;j<lim;j+=(i<<1)){
int G=1;
for(int k=0;k<i;++k,G=mul(G,gn)){
int x=A[j+k],y=mul(G,A[i+j+k]);
A[j+k]=add(x,y);A[i+j+k]=add(x,mod-y);
}
}
}
if(tp==1)return;
int inv=qpow(lim,mod-2);
for(int i=0;i<lim;++i)A[i]=mul(A[i],inv);
}
void Inv(int d,int *a,int *b){
if(d==1){b[0]=qpow(a[0],mod-2);return;}
Inv((d+1)>>1,a,b);
int lim=1,len=0;
while(lim<(d<<1))lim<<=1,len++;
for(int i=1;i<lim;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-1));
for(int i=0;i<d;++i)c[i]=a[i];
for(int i=d;i<lim;++i)c[i]=0;
NTT(c,lim,1);NTT(b,lim,1);
for(int i=0;i<lim;++i)b[i]=1ll*(2-1ll*b[i]*c[i]%mod+mod)%mod*b[i]%mod;
NTT(b,lim,-1);for(int i=d;i<lim;++i)b[i]=0;
}
inline void Dx(int *a,int *b,int L){for(int i=1;i<L;++i)b[i-1]=mul(i,a[i]);b[L-1]=0;}
inline void Int(int *a,int *b,int L){for(int i=1;i<L;++i)b[i]=mul(a[i-1],qpow(i,mod-2));b[0]=0;}
void Ln(int L,int *a,int *R){
Dx(a,e,L);Inv(L,a,f);
int lim=1,len=0;
while(lim<(L<<1))lim<<=1,len++;
for(int i=1;i<lim;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-1));
NTT(e,lim,1);NTT(f,lim,1);
for(int i=0;i<lim;++i)e[i]=mul(e[i],f[i]);
NTT(e,lim,-1);Int(e,R,lim);
}
void Exp(int d,int *a,int *b){
if(d==1){b[0]=1;return;}
Exp((d+1)>>1,a,b);
Ln(d,b,lnb);
int lim=1,len=0;
while(lim<(d<<1))lim<<=1,len++;
for(int i=1;i<lim;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-1));
for(int i=0;i<d;++i)lnb[i]=a[i]>=lnb[i]?a[i]-lnb[i]:a[i]-lnb[i]+mod;
for(int i=d;i<lim;++i)b[i]=lnb[i]=0;
lnb[0]++;lnb[0]%=mod;
NTT(lnb,lim,1);NTT(b,lim,1);
for(int i=0;i<lim;++i)b[i]=mul(b[i],lnb[i]);
NTT(b,lim,-1);
for(int i=d;i<lim;++i)b[i]=0;
}
signed main(){
scanf("%lld",&n);
for(int i=0;i<n;++i)scanf("%lld",&a[i]);
int len=1;
while(len<=n)len<<=1;
Exp(len,a,k);
//Ln(len,a,k);
for(int i=0;i<n;++i)printf("%lld ",k[i]);
puts("");
return 0;
}