#include <bits/stdc++.h>
using namespace std;
#define ll long long
namespace acac
{
inline ll read()
{
ll ans=0,fh=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')fh=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
ans=ans*10+ch-'0';
ch=getchar();
}
return ans*fh;
}
ll n;
int m,k,Len;
const int mod=998244353;
int wz[2000010];
int yg[2000010],qaq[500010];
int A[500010],C[2000010],B[2][2000010],X[2000010],Y[2000010],DA[500010],DC[2000010];
int jl[2000010];
void print(int A[],int n)//项数
{
cout<<n<<": ";
for(int i=0;i<n;i++)
{
cout<<A[i]<<' ';
}
cout<<'\n';
}
inline int add(int a,int b){return (a+=b)>=mod?a-mod:a;}
int readm()
{
ll ans=0,fh=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')fh=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
ans=(ans*10+ch-'0')%mod;
ch=getchar();
}
return ans*fh;
}
inline int ksm(int a,int k,int ok)
{
int ans=1,bs=a;
while(k)
{
if(k&1)ans=1ll*bs*ans%mod;
bs=1ll*bs*bs%mod;
k>>=1;
}
return ans;
}
int ls=0;
inline void pre(int xz,int w)
{
if(xz==ls)return ;
for(int i=1;i<xz;i++)
{
wz[i]=(wz[i>>1]>>1)|((i&1)<<w);
}
ls=xz;
}
void init(int n)
{
int tot=0;
for(int i=2;i<=(n<<1);i<<=1)
{
yg[++tot]=ksm(3,(mod-1)/i,0);
}
}
int ook;
inline void NTT(int n,int A[],int tmp)
{
for(int i=1;i<n;i++)
{
if(i<wz[i])swap(A[wz[i]],A[i]);
}
int tot=0;
for(int mid=1;(mid<<1)<=n;mid<<=1)
{
int len=(mid<<1);
int num;
num=yg[++tot];
for(int j=0;j<n;j+=len)
{
int w=1;
for(int i=j;i<mid+j;i++)
{
int v=1ll*w*A[i+mid]%mod;//卡常
A[i+mid]=add(A[i],mod-v);
// if(A[i+mid]<0)A[i+mid]+=mod;
A[i]=add(A[i],v);
// if(A[i]>=mod)A[i]-=mod;
w=1ll*w*num%mod;
}
}
}
if(tmp==-1)
{
reverse(A+1,A+n);
int now=ksm(n,mod-2,1);
jl[n]=now;
for(int i=0;i<n;i++)
{
A[i]=1ll*A[i]*now%mod;
}
}
}
int ycl[3][2000010];
int BJ,ok;
inline void cf(int n,int A[],int B[],int ys)
{
for(int i=0;i<(n>>1);i++)
{
X[i]=A[i],Y[i]=B[i];
if(ys&&n==BJ)Y[i]=ycl[ys][i];
}
if(ys&&n==BJ)
{
for(int i=(n>>1);i<n;i++)
{
Y[i]=ycl[ys][i];
}
// print(Y,n);
}
// print(X,n);
NTT(n,X,1);
if(!ys||n!=BJ)NTT(n,Y,1);
// if(ok)print(Y,n);
ok=0;
for(int i=0;i<n;i++)
{
X[i]=1ll*X[i]*Y[i]%mod;
}
NTT(n,X,-1);
for(int i=0;i<n;i++)
{
A[i]=X[i];
X[i]=Y[i]=0;
}
//cout<<endl;
}
int t;
inline void solve(int m,int A[])
{
// memset(B,0,sizeof(B));
B[0][0]=ksm(A[0],mod-2,0);
t=0;
int len=1;
int Len=2;
//cout<<m<<endl;
while(Len<=m)
{
Len<<=1;
len=(int)floor(log(Len)/log(2)+0.3)-1;
pre(Len,len);
t^=1;
// memset(B[t],0,sizeof(B[t]));
for(int i=0;i<=Len;i++)
{
B[t][i]=B[t^1][i]*2;
if(B[t][i]>=mod)B[t][i]-=mod;
// cout<<B[t][i]<<' ';
}
cf(Len,B[t^1],B[t^1],0);
cf(Len,B[t^1],A,0);
for(int i=0;i<=Len;i++)
{
B[t][i]=B[t][i]-B[t^1][i];
if(B[t][i]<0)B[t][i]+=mod;
}
// print(B[t],Len+1);
// bas<<=1,Len<<=1,len++;
// if(bas<m)pre(Len,len);
}
}
inline int qn(int n,int A[])//项数
{
// memset(B,0,sizeof(B));
int Len=2;
int m=n;
Len=__lg(m)+1;
Len=(1<<Len);
solve(Len,A);
for(int i=0;i<Len;i++)
{
A[i]=B[t][i];
// cout<<B[t][i]<<' ';
//cout<<i<<endl;
B[t][i]=B[t^1][i]=0;
}
return Len*2;
}
int ANS[4000010];
int CD;
int fc(int n,int m,int A[],int C[],int ANS2[])//A项数,B项数
{
//print(A,n);
if(n<m)
{
for(int i=0;i<m;i++)
{
ANS2[i]=A[i];
}
return Len;
}
// memset(DA,0,sizeof(DA));
for(int i=0;i<=n;i++)
{
DA[n-i]=A[i];
}
for(int i=n-m+1;i<=n;i++)
{
DA[i]=0;
}
int cd=CD;
cd=__lg(n*4)+1;
cd=(1<<cd);
pre(cd,(int)floor(log(cd)/log(2)+0.3)-1);
cf(cd,DA,DC,2);
reverse(DA,DA+n-m+1);
for(int i=n-m+1;i<=n;i++)
{
DA[i]=0;
}
ok=1;
cf(cd,DA,C,1);
for(int i=0;i<m;i++)
{
ANS2[i]=add(mod,A[i]-DA[i]);
// if(ANS2[i]<0)ANS2[i]+=mod;
}
// for(int i=m;i<=cd;i++)
// {
// ANS2[i]=0;
// }
return cd;
}
int f[100010],g[100010],BS[2000010],tz[2000010];
int qm(int Len,int p,int A[],int B[])
{
int awa=min(k*2,p);
pre(Len,(int)floor(log(Len)/log(2)+0.3)-1);
cf(Len,A,B,0);
Len=fc(awa,k,A,tz,qaq);
memcpy(A,qaq,sizeof (qaq));
// print(A,k+1);
return Len;
}
inline void qd(int A[],int B[],int n)
{
for(int i=1;i<n;i++)
{
B[i-1]=1ll*i*A[i]%mod;
}
B[n-1]=0;
}
inline void jf(int A[],int B[],int n)
{
for(int i=1;i<n;i++)
{
B[i]=1ll*A[i-1]*ksm(i,mod-2,0)%mod;
}
B[0]=0;
}
int LnC[500010];
void Ln(int A[],int B[],int n)
{
// cout<<n<<endl;
qd(A,LnC,n);
for(int i=0;i<=n;i++)
{
DA[i]=A[i];
}
qn(n,DA);
//print(A,n);
int Len=__lg(2*n);
Len=(1<<Len);
if(Len<2*n)Len<<=1;
pre(Len,(int)floor(log(Len)/log(2)+0.3)-1);
//cout<<Len<<endl;
cf(Len,DA,LnC,0);
//print(A,n);
jf(DA,B,n);
for(int i=Len/2;i<=Len;i++)
{
LnC[i]=0;
}
}
int ExC[500010];
void Exp(int A[],int B[],int n) //拓展次数多一次(2^k)
{
if(n==1)
{
B[0]=1;
return ;
}
Exp(A,B,n>>1);
Ln(B,ExC,n);
ExC[0]=add(A[0]+1,mod-ExC[0]);
for(int i=1;i<n;i++)
{
ExC[i]=add(A[i],mod-ExC[i]);
}
pre(n,(int)floor(log(n)/log(2)+0.3)-1);
cf(n,B,ExC,0);
//print(B,n);
n<<=1;
for(int i=n/2;i<n;i++)
{
ExC[i]=0;
}
}
int main()
{
init(600000);
n=read();
k=readm();
for(int i=0;i<n;i++)
{
f[i]=read();
}
// cout<<k<<endl;
Ln(f,A,n);
// print(A,n);
for(int i=0;i<n;i++)
{
A[i]=A[i]*(ll)k%mod;
}
int Len=__lg(n);
Len=(1<<Len);
if(Len<n)Len<<=2;
Exp(A,g,Len);
for(int i=0;i<n;i++)
{
cout<<g[i]<<' ';
}
return 0;
}
}
int main()
{
// freopen("P5245_8.in","r",stdin);
// freopen("out.out","w",stdout);
acac::main();
return 0;
}
/*
6 4
3 -1 0 4
-2 3 1 5
*/
rt,这道题目也没有黑科技啊QWQ
本机上跑1.4到这里就1.62了