按照 Karry 神的方法卡,没有任何作用……
#include <iostream>
#include <cstdio>
using namespace std;
const int N=(1<<19)+5,MOD=998244353;
int A[N],B[N],T1[N],T2[N],E[N],rev[N],g[20],invg[20];
int ppp,qqq;
char buf[1<<20];
inline char gc()
{
if(ppp==qqq) ppp=0,qqq=fread(buf,1,1<<20,stdin);
return buf[ppp++];
}
inline int rd1()
{
char x;
while((x=gc())<'0'||x>'9');int t=x-'0';
while((x=gc())>='0'&&x<='9') t=(10ll*t+x-'0')%MOD;
return t;
}
inline int rd2()
{
char x;
while((x=gc())<'0'||x>'9');int t=x-'0';
while((x=gc())>='0'&&x<='9') t=t*10+x-'0';
return t;
}
inline int qpow(int x,int y)
{
int ret=1;
while(y)
{
if(y&1) ret=1ll*ret*x%MOD;
x=1ll*x*x%MOD;
y>>=1;
}
return ret;
}
inline void NTT(int *p,int lim,int typ)
{
int i,j,k,cnt=1;
for(i=0;i<lim;i++) rev[i]=rev[i>>1]>>1|(i&1?lim>>1:0);
for(i=0;i<lim;i++) if(rev[i]>i) swap(p[i],p[rev[i]]);
for(i=2;i<=lim;i<<=1)
{
int tg= typ==1?g[cnt]:invg[cnt];
for(j=0;j<lim;j+=i)
{
int l=i>>1,tmp=1;
for(k=0;k<l;k++)
{
int tt=1ll*tmp*p[j+k+l]%MOD;
p[j+k+l]=(p[j+k]-tt+MOD)%MOD;
p[j+k]=(p[j+k]+tt)%MOD;
tmp=1ll*tmp*tg%MOD;
}
}
cnt++;
}
}
void INV(const int *F,int *G,int lim)
{
int i,lim2=lim<<1;
if(lim==1){G[0]=qpow(F[0],MOD-2);return;}
INV(F,G,lim>>1);
for(i=0;i<lim;i++) T1[i]=F[i];
for(i=lim;i<lim2;i++) T1[i]=0;
NTT(G,lim2,1),NTT(T1,lim2,1);
for(i=0;i<lim2;i++) G[i]=(G[i]*2ll%MOD-1ll*G[i]*G[i]%MOD*T1[i]%MOD+MOD)%MOD;
NTT(G,lim2,-1);int inv=qpow(lim2,MOD-2);
for(i=0;i<lim;i++) G[i]=1ll*G[i]*inv%MOD,T1[i]=0;
for(i=lim;i<lim2;i++) G[i]=0,T1[i]=0;
}
inline void LN(int *p,int lim)
{
int i,lim2=lim<<1;
INV(p,B,lim);
for(int i=0;i<lim;i++) p[i]=1ll*p[i+1]*(i+1)%MOD;
NTT(p,lim2,1),NTT(B,lim2,1);
for(i=0;i<lim2;i++) p[i]=1ll*p[i]*B[i]%MOD;
NTT(p,lim2,-1);int inv=qpow(lim2,MOD-2);
for(i=0;i<lim;i++) p[i]=1ll*p[i]*inv%MOD,B[i]=0;
for(i=lim;i<lim2;i++) p[i]=0,B[i]=0;
for(int i=lim;i>0;i--) p[i]=1ll*p[i-1]*qpow(i,MOD-2)%MOD;p[0]=0;
}
void EXP(const int *F,int *G,int lim)
{
int i,lim2=lim<<1;
if(lim==1){G[0]=1;return;}
EXP(F,G,lim>>1);
for(i=0;i<lim;i++) T2[i]=G[i];
for(i=lim;i<lim2;i++) T2[i]=0;
LN(T2,lim);
T2[0]=(1+F[0]-T2[0]+MOD)%MOD;
for(i=1;i<lim;i++) T2[i]=(F[i]-T2[i]+MOD)%MOD;
NTT(G,lim2,1),NTT(T2,lim2,1);
for(i=0;i<lim2;i++) G[i]=1ll*G[i]*T2[i]%MOD;
NTT(G,lim2,-1);int inv=qpow(lim2,MOD-2);
for(i=0;i<lim;i++) G[i]=1ll*G[i]*inv%MOD,T2[i]=0;
for(i=lim;i<lim2;i++) G[i]=0,T2[i]=0;
}
int main()
{
int n=rd2(),k=rd1(),i;
for(i=0;i<n;i++) A[i]=rd2();
int lim=1,cnt=0;
while(lim<=(n<<1)) lim<<=1,cnt++;
for(i=0;i<=cnt+1;i++)
{
g[i]=qpow(3,(MOD-1)/(1<<i));
invg[i]=qpow(g[i],MOD-2);
}
LN(A,lim);
for(i=0;i<lim;i++) A[i]=1ll*A[i]*k%MOD;
EXP(A,E,lim);
for(i=0;i<n;i++) printf("%d ",E[i]);
return 0;
}