CODE
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize(3,"Ofast","inline")
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <cmath>
#include "../debuger.h"
using namespace std;
template<typename _Tp>
inline void red(_Tp &x) {
x=0;bool fg=0;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') fg^=1;ch=getchar();}
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(_Tp)(ch^48),ch=getchar();
if(fg) x=-x;
}
typedef long long ll;
/*-------------------------------BEGIN POLY FAMILY BUCKET---------------------------------------*/
#define clr(f,n) memset(f,0,sizeof(long long)*(n))
#define cpy(f,g,n) memcpy(f,g,sizeof(long long)*(n))
#define Outarr(x,n) cerr<<#x<<" : "; for(int i=0;i<n;++i) cerr<<x[i]<<" ";cout<<endl;
#define outarr(x,n) for(int i=0;i<n;++i) printf("%lld%c",x[i],(i==n-1)?'\n':' ');
#define MOD(x) ((x)<mod?(x):((x)%mod))
namespace poly {
const int mod = 998244353;
const int N = (1<<19);
const int _G = 3;
const int _iG = 332748118;
const int inv2 = 499122177;
ll fpow(ll a,ll b,ll p) {
ll r=1;
for(;b;a=a*a%p,b>>=1) if(b&1) r=r*a%p;
return r;
}
int rev[N],rev_n;
void prerev(int n) {
if(n==rev_n) return;
rev_n=n;
for(int i=0;i<n;++i) rev[i]=(rev[i>>1]>>1)|((i&1)?(n>>1):0);
}
// NTT : fg=1 DFT fg=-1 IDFT
template<typename IT>
void NTT(IT f,int n,int fg) {
prerev(n);
for(int i=0;i<n;++i) if(i<rev[i]) swap(f[i],f[rev[i]]);
for(int h=2;h<=n;h<<=1) {
ll Dt=fpow((fg==1)?_G:_iG,(mod-1)/h,mod),w;
int len=h>>1;
for(int j=0;j<n;j+=h) {
w=1;
for(int k=j;k<j+len;++k) {
ll tmp=MOD(f[k+len]*w);
f[k+len]=f[k]-tmp; (f[k+len]<0)&&(f[k+len]+=mod);
f[k]=f[k]+tmp; (f[k]>=mod)&&(f[k]-=mod);
w=MOD(w*Dt);
}
}
}
if(fg==-1) {
ll invn=fpow(n,mod-2,mod);
for(int i=0;i<n;++i) f[i]=MOD(f[i]*invn);
}
}
// f(x) = f*g(x) n = def f ; m = def g ; len = 最终长度(保留几位)
void p_mul(ll f[],ll g[],int n,int m,int len) {
static ll a[N],b[N];
int nn=1<<(int)ceil(log2(n+m-1));
clr(a,nn); clr(b,nn); cpy(a,f,n); cpy(b,g,m);
NTT(a,nn,1); NTT(b,nn,1);
for(int i=0;i<nn;++i) a[i]=MOD(a[i]*b[i]);
NTT(a,nn,-1);
for(int i=0;i<len;++i) f[i]=a[i];
}
// f(x) = g^-1(x) f(x) 为 g(x) 模 x^n 意义下的逆
void p_inv(ll g[],int n,ll f[]) {
static ll sav[N];
int nn=1<<(int)ceil(log2(n));
clr(f,n*2);
f[0]=fpow(g[0],mod-2,mod);
for(int h=2;h<=nn;h<<=1) {
cpy(sav,g,h); clr(sav+h,h);
NTT(sav,h<<1,1); NTT(f,h<<1,1);
for(int i=0;i<(h<<1);++i) {
f[i]=f[i]*(2ll-f[i]*sav[i]%mod+mod)%mod;
}
NTT(f,h<<1,-1); clr(f+h,h);
}
clr(f+n,nn*2-n);
}
// f^2(x) = g(x) f(x) 为 g(x) 模 x^n 意义下的开方
void p_sqrt(ll g[],int n,ll f[]) {
static ll sav[N],r[N];
int nn=1<<(int)ceil(log2(n));
clr(f,n*2); f[0]=1; // g[0] should be 1 otherwise
for(int h=2;h<=nn;h<<=1) {
cpy(sav,g,h); clr(sav+h,h); p_inv(f,h,r);
NTT(sav,h<<1,1); NTT(r,h<<1,1);
for(int i=0;i<(h<<1);++i) sav[i]=MOD(sav[i]*r[i]);
NTT(sav,h<<1,-1);
for(int i=0;i<h;++i) f[i]=MOD((f[i]+sav[i])*inv2);
clr(f+h,h);
}
clr(f+n,nn*2-n);
}
// f(x) = g(x) * q(x) + r(x) : q(x) 为商 r(x) 为余数
void p_div(ll f[],ll g[],int n,int m,ll q[],ll r[]) {
static ll sav1[N],sav2[N];
int nn; for(nn=1;nn<n-m+1;nn<<=1);
clr(sav1,nn); clr(sav2,nn); cpy(sav1,f,n); cpy(sav2,g,m);
reverse(sav1,sav1+n); reverse(sav2,sav2+m);
p_inv(sav2,n-m+1,q); p_mul(q,sav1,n-m+1,n,n-m+1);
reverse(q,q+n-m+1); cpy(r,g,m);
p_mul(r,q,m,n-m+1,m-1);
for(int i=0;i<m-1;++i) r[i]=MOD(f[i]-r[i]+mod);
}
// 预处理乘法逆元
ll inv[N],fac[N],ifac[N];
void Initinv(int n) {
inv[0]=inv[1]=1;
fac[0]=fac[1]=ifac[0]=ifac[1]=1;
for(int i=2;i<n;++i) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
for(int i=2;i<n;++i) fac[i]=fac[i-1]*i%mod;
for(int i=2;i<n;++i) ifac[i]=ifac[i-1]*inv[i]%mod;
}
// 对 f(x) 进行积分 Initinv() first
void p_int(ll f[],int n) {
for(int i=n-1;i;--i) f[i]=MOD(f[i-1]*inv[i]);
f[0]=0;
}
// 对 f(x) 进行求导
void p_der(ll f[],int n) {
for(int i=1;i<n;++i) f[i-1]=MOD(f[i]*i);
f[n-1]=0;
}
// f(x) <- ln f(x) f[0] should be 1
void p_ln(ll f[],int n) {
static ll g[N];
p_inv(f,n,g); p_der(f,n);
p_mul(f,g,n,n,n+n);
p_int(f,n);
}
// f(x) <- exp f(x) (倍增版) f[0] should be 0
void p_exp(ll f[],int n) {
static ll g[N],sav[N];
clr(g,n*2); clr(sav,n*2); g[0]=1;
for(int h=2;h<=n;h<<=1) {
cpy(sav,g,h); p_ln(sav,h);
for(int i=0;i<h;++i) sav[i]=MOD(f[i]-sav[i]+mod);
sav[0]=MOD(sav[0]+1);
p_mul(g,sav,h,h,h);
}
cpy(f,g,n);
}
/*
void _p_exp(ll f[],ll g[],int l,int r) {
static ll A[N],B[N];
if(r-l==1) {if(l>0) f[l]=MOD(f[l]*fpow(l,mod-2,mod));return ;}
int mid=(l+r)>>1,len=mid-l;
_p_exp(f,g,l,mid);
cpy(A,f+l,len); clr(A+len,len); cpy(B,g,len<<1);
p_mul(A,B,len<<1,len<<1,len<<1);
for(int i=mid;i<r;++i) f[i]=MOD(f[i]+A[i-l]);
_p_exp(f,g,mid,r);
}
// f(x) <- exp f(x) (分治 FFT 版) f[0] should be 0
void p_exp(ll f[],int n) {
static ll g[N];
cpy(g,f,n); clr(f,n); f[0]=1;
for(int i=0;i<n;++i) g[i]=MOD(g[i]*i);
_p_exp(f,g,0,n);
}
*/
// f(x) <- f^k(x) f(x) 模 x^n 意义下的 k 次
void p_pow(ll f[],int n,ll k) {
p_ln(f,n);
for(int i=0;i<n;++i) f[i]=MOD(f[i]*k);
p_exp(f,n);
}
// 分治FFT [l,r) F[n] = sum(0<i<=n) F[n-i]G[i]
void DCFFT(ll f[],ll g[],int l,int r) {
static ll A[N],B[N];
if(r-l==1) return ;
int mid=(l+r)>>1,len=mid-l;
DCFFT(f,g,l,mid);
cpy(A,f+l,len); clr(A+len,len); cpy(B,g,len<<1);
p_mul(A,B,len<<1,len<<1,len<<1);
for(int i=mid;i<r;++i) f[i]=MOD(f[i]+A[i-l]);
DCFFT(f,g,mid,r);
}
}
using poly::p_ln;
using poly::p_exp;
using poly::p_inv;
using poly::p_mul;
using poly::NTT;
using poly::ifac;
using poly::fac;
using poly::inv;
using poly::mod;
/*------------------------------- END POLY FAMILY BUCKET ---------------------------------------*/
const int N = (1<<19);
int n,m,nn;
ll a[N],G[N],f[N],h[N];
vector<ll> F[N<<2][2];
#define ls (x<<1)
#define rs (x<<1|1)
void solve(int l=1,int r=n,int x=1) {
if(l==r) {
F[x][0].resize(2,0);
F[x][1].resize(2,0);
F[x][0][0]=1;
F[x][1][0]=1;
F[x][1][1]=mod-a[l];
return ;
}
int mid=(l+r)>>1;
solve(l,mid,ls);solve(mid+1,r,rs);
int n=F[ls][1].size()+F[rs][1].size()-1;
int nn=1<<(int)ceil(log2(n));
F[ls][0].resize(nn,0);F[ls][1].resize(nn,0);
F[rs][0].resize(nn,0);F[rs][1].resize(nn,0);
F[x][0].resize(nn,0);F[x][1].resize(nn,0);
NTT(F[ls][0].begin(),nn,1);
NTT(F[rs][0].begin(),nn,1);
NTT(F[ls][1].begin(),nn,1);
NTT(F[rs][1].begin(),nn,1);
for(int i=0;i<nn;++i)
F[x][1][i]=MOD(F[ls][1][i]*F[rs][1][i]);
for(int i=0;i<nn;++i)
F[x][0][i]=(F[ls][1][i]*F[rs][0][i]+F[ls][0][i]*F[rs][1][i])%mod;
NTT(F[x][0].begin(),nn,-1);
NTT(F[x][1].begin(),nn,-1);
F[x][0].resize(n,0);
F[x][1].resize(n,1);
}
int main() {
red(n);red(m);
nn=1<<(int)ceil(log2(m+1));
poly::Initinv(1<<19);
for(int i=0;i<nn;++i) G[i]=ifac[i+1];
p_ln(G,nn);
for(int i=1;i<=n;++i) {
red(a[i]);a[i]%=mod;
}
solve();
seeln(F[1][0]); seeln(F[1][1]);
for(int i=0;i<nn;++i) {
if(i>=F[1][1].size()) break;
f[i]=F[1][1][i];
}
p_inv(f,nn,h);
clr(f,nn);
for(int i=0;i<nn;++i) {
if(i>=F[1][0].size()) break;
f[i]=F[1][0][i];
}
p_mul(f,h,nn,nn,nn);
outarr(f,nn);
for(int i=0;i<nn;++i) {
G[i]=G[i]*f[i]%mod;
}
p_exp(G,nn);
for(int i=1;i<=m;++i) {
ll ans=fac[i]*G[i]%mod;
printf("%lld ",ans);
}
puts("");
return 0;
}