人傻常数大
#include<bits/stdc++.h>
using namespace std;
#define _r return*this
#define _o &operator
namespace IO
{
const int _S=1<<21;
char b[_S],*p1=b,*p2=b,pb[_S],*pp=pb;
void fl(){fwrite(pb,1,pp-pb,stdout),pp=pb;}
struct input
{
char gc(){if(p1==p2)p2=(p1=b)+fread(b,1,_S,stdin);return p1==p2?' ':*p1++;}
input _o>>(char&num){do num=gc();while(num==' '||num=='\n'||num=='\r'||num=='\t');_r;}
template<typename T>input _o>>(T&x)
{
char c=gc();T f=1;
for(x=0;!isdigit(c);)(c=='-'?f=-1:1),c=gc();
while(isdigit(c))x=(x*10)+(c^48),c=gc();
x*=f;_r;
}
input(){}
}in;
struct output
{
void pt(char num){*pp++=num;if(pp-pb==_S)fl();}
output _o<<(char num){pt(num);_r;}
template<typename T>output _o<<(T x)
{
if(!x){pt(48);_r;}
if(x<0)pt('-'),x=-x;
int s[64],t=0;
while(x)s[++t]=x%10,x/=10;
while(t)pt(s[t--]+48);
_r;
}
output _o<<(const char*s){int num=0;while(s[num])pt(s[num++]);_r;}
output(){}
}out;
struct fe{~fe(){fl();}}fls;
int read(){int x;return in>>x,x;}
long long readll(){long long x;return in>>x,x;}
}
using IO::in;
using IO::out;
using IO::read;
using IO::readll;
using ll=long long;
#define N 1600001ll
#define MOD 998244353ll
#define G 3ll
#define popc __builtin_popcountll
#define ctz __builtin_ctzll
#define clz __builtin_clzll
ll qpow(ll x,ll p)
{
ll res=1;
while(p)
{
if(p&1)(res*=x)%=MOD;
(x*=x)%=MOD,p>>=1;
}
return res;
}
const ll inv2=qpow(2,MOD-2);
ll lim=1,siz;
ll rev[N];
ll rt[N];
void init(ll n)
{
lim=1,siz=0;
while(lim<=n)lim<<=1,siz++;
for(int i=1;i<lim;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(siz-1));
ll w=qpow(G,(MOD-1)>>siz);
rt[lim>>1]=1;
for(int i=(lim>>1)+1;i<lim;i++)rt[i]=rt[i-1]*w%MOD;
for(int i=(lim>>1)-1;i;i--)rt[i]=rt[i<<1];
}
ll getLen(ll n){return 1<<(64-clz(n));}
void DFT(ll*f,ll n)
{
static ll a[N];
for(int i=0,j=siz-ctz(n);i<n;i++)a[rev[i]>>j]=f[i];
for(int i=1;i<n;i<<=1)for(int j=0;j<n;j+=i<<1)for(int k=0;k<i;k++)
{
ll x=a[i|j|k]*rt[i|k]%MOD;
a[i|j|k]=(a[j|k]-x+MOD)%MOD,(a[j|k]+=x)%=MOD;
}
for(int i=0;i<n;i++)f[i]=a[i];
}
void IDFT(ll*f,ll n)
{
reverse(f+1,f+n),DFT(f,n);
for(ll i=0,j=MOD-((MOD-1)>>ctz(n));i<n;i++)(f[i]*=j)%=MOD;
}
void getInv(ll*f,ll*g,ll n)
{
static ll h[N];
if(n==1)
{
g[0]=qpow(f[0],MOD-2);
return;
}
getInv(f,g,(n+1)>>1);
init(n<<1);
for(int i=0;i<n;i++)h[i]=f[i];
for(int i=n;i<lim;i++)h[i]=0;
DFT(g,lim),DFT(h,lim);
for(int i=0;i<lim;i++)(g[i]*=((MOD+2-g[i]*h[i]%MOD)%MOD))%=MOD;
IDFT(g,lim);
for(int i=n;i<lim;i++)g[i]=0;
}
void Dao(ll*f,ll*g,ll n)
{
for(int i=1;i<n;i++)g[i-1]=f[i]*i%MOD;
g[n-1]=0;
}
void JiFen(ll*f,ll*g,ll n)
{
for(int i=1;i<n;i++)g[i]=f[i-1]*qpow(i,MOD-2)%MOD;
g[0]=0;
}
void getLn(ll*f,ll*g,ll n)
{
static ll a[N],b[N];
init(n<<1);
for(int i=0;i<lim;i++)a[i]=b[i]=0;
Dao(f,a,lim),getInv(f,b,n);
init(n<<1),DFT(a,lim),DFT(b,lim);
for(int i=0;i<lim;i++)(a[i]*=b[i])%=MOD;
IDFT(a,lim),JiFen(a,g,lim);
}
void getExp(ll*f,ll*g,ll n)
{
static ll h[N];
if(n==1)
{
g[0]=1;
return;
}
getExp(f,g,n>>1),getLn(g,h,n);
init(n),h[0]=(MOD+f[0]+1-h[0])%MOD;
for(int i=1;i<n;i++)h[i]=(MOD+f[i]-h[i])%MOD;
DFT(g,lim),DFT(h,lim);
for(int i=0;i<lim;i++)(g[i]*=h[i])%=MOD;
IDFT(g,lim);
for(int i=n;i<lim;i++)g[i]=h[i]=0;
}
void getSqrt(ll*f,ll*g,ll n)
{
static ll a[N],b[N];
if(n==1)
{
g[0]=1;
return;
}
getSqrt(f,g,(n+1)>>1);
for(int i=0;i<=n<<1;i++)b[i]=0;
getInv(g,b,n),init(n<<1);
for(int i=0;i<n;i++)a[i]=f[i];
for(int i=n;i<lim;i++)a[i]=0;
DFT(g,lim),DFT(a,lim),DFT(b,lim);
for(int i=0;i<lim;i++)(((g[i]+=a[i]*b[i]%MOD)%=MOD)*=inv2)%=MOD;
IDFT(g,lim);
for(int i=n;i<lim;i++)g[i]=0;
}
const ll I=qpow(G,((MOD-1)>>2)*3);
ll n,op;
ll f[N],g1[N],g2[N];
ll inv;
int main()
{
in>>n>>op,inv=qpow(2,MOD-2)*(op?1:qpow(I,MOD-2))%MOD;
for(int i=0;i<n;i++)f[i]=readll()*I%MOD;
getExp(f,g1,getLen(n));
for(int i=0;i<n;i++)f[i]=(MOD-f[i])%MOD;
getExp(f,g2,getLen(n));
if(!op)for(int i=0;i<n;i++)g2[i]=(MOD-g2[i])%MOD;
for(int i=0;i<n;i++)out<<(g1[i]+g2[i])%MOD*inv%MOD<<" ";
}