RT
样例输出:
1 998244347 998243810 998236969 998193977
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define clr(a,b,n) memset((a),(b),sizeof(ll)*(n))
#define cpy(a,b,n) memcpy((a),(b),sizeof(ll)*(n))
const int N=2.5e5+5,P=998244353;
int n,m,rev[N],revn;
ll a[N];
ll qpow(ll a,ll b){
ll res=1;
while(b){
if(b&1) res=res*a%P;
a=a*a%P,b>>=1;
}
return res;
}
ll inv3=qpow(3,P-2);
void calc_rev(int lim){
if(revn==lim) return;
revn=lim;
for(int i=0;i<lim;i++)
rev[i]=(rev[i>>1]>>1)|(i&1?lim>>1:0);
}
void calc_num(ll *f,ll *g,int lim){
for(int i=0;i<lim;i++)
f[i]=f[i]*g[i]%P;
}
void ntt(ll *f,int lim,bool flag){
calc_rev(lim);
for(int i=0;i<lim;i++)
if(i<rev[i]) swap(f[i],f[rev[i]]);
for(int Len=2;Len<=lim;Len<<=1){
int len=Len>>1;
ll sav=qpow(flag?3:inv3,(P-1)/Len);
for(int l=0;l<lim;l+=Len){
ll buf=1;
for(int i=l;i<l+len;i++){
ll tmp=buf*f[i+len]%P;
f[i+len]=(f[i]-tmp+P)%P,f[i]=(f[i]+tmp)%P;
buf=buf*sav%P;
}
}
}
if(flag==1) return;
ll inv=qpow(lim,P-2);
for(int i=0;i<lim;i++)
f[i]=f[i]*inv%P;
}
ll r0[N],r[N],g[N];
void INV(ll *f,int limit){
int lim;for(lim=1;lim<limit;lim<<=1);
clr(r0,0,lim<<1),clr(r,0,lim<<1),clr(g,0,lim<<1);
r0[0]=qpow(f[0],P-2);
for(int len=2;len<=lim;len<<=1){
for(int i=0;i<(len>>1);i++)
r[i]=(r0[i]<<1)%P;
cpy(g,f,len);
ntt(r0,len<<1,1),ntt(g,len<<1,1);
calc_num(r0,r0,len<<1);
calc_num(r0,g,len<<1);
ntt(r0,len<<1,0),clr(r0+len,0,len);
for(int i=0;i<len;i++)
r[i]=(r[i]-r0[i]+P)%P;
}
cpy(f,r,limit);
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
INV(a,n);
for(int i=0;i<n;i++)
printf("%lld ",a[i]);
return 0;
}