#include<cmath>#include<vector>#include<iostream>#include<unordered_map>using ll =longlong;
using ull =unsignedlonglong;
usingnamespace std;
constint N =2.6e6+10;
const ll P =998244353;
const ll GG =114514;
constint inv2 =499122177;
int rev[N], n, m;
voidpret (int& n) {
int k =1;
while (k <= n) k <<=1;
n = k;
for (int i =0; i < n; i ++)
rev[i] = (rev[i >>1] >>1) | ((i &1) ? n >>1:0);
}
ll qpow (ll base, int k) {
ll res =1;
while (k) {
if (k &1) res = res * base % P;
base = base * base % P;
k >>=1;
}
return res;
}
const ll invGG = qpow (GG, P -2);
voidNTT (int* g, bool flag, int n) {
static ull f[N], w[N];
for (int i =0; i < n; i ++) f[i] = g[ rev[i] ];
w[0] =1;
for (int l =1; l < n; l <<=1) {
ull G = qpow (flag ?GG : invGG, (P -1) / (l <<1));
for (int i =1; i < l; i ++) w[i] = w[i -1] * G % P;
for (int k =0; k < n; k += (l <<1))
for (int p =0; p < l; p ++) {
int t = w[p] * f[k | p | l] % P;
f[k | p | l] = f[k | p] + P - t;
f[k | p] += t;
}
if (l == (1<<17)) for (int i =0; i < n; i ++) f[i] %= P;
}
if (!flag) {
ull invn = qpow (n, P -2);
for (int i =0; i < n; i ++) g[i] = f[i] % P * invn % P;
} elsefor (int i =0; i < n; i ++) g[i] = f[i] % P;
}
vector <int> f, g;
vector <int>operator+ (const vector <int>& x, const vector <int>& y) {
int l = max ( x.size (), y.size () );
vector <int> ans(l);
for (int i =0; i < l; i ++) {
int v1 = (i < x.size ()) ? x[i] :0;
int v2 = (i < y.size ()) ? y[i] :0;
ans[i] = (v1 + v2) % P;
}
while (ans.size () &&!ans.back ()) ans.pop_back ();
return ans;
}
vector <int>operator- (const vector <int>& x, const vector <int>& y) {
int l = max ( x.size (), y.size () );
vector <int> ans (l);
for (int i =0; i < l; i ++) {
int v1 = (i < x.size ()) ? x[i] :0;
int v2 = (i < y.size ()) ? y[i] :0;
ans[i] = (v1 - v2 + P) % P;
}
while (ans.size () &&!ans.back ()) ans.pop_back ();
return ans;
}
vector <int>operator* (const vector <int>& x, const vector <int>& y) {
staticint f[N], g[N];
int n = x.size () -1, m = y.size () -1;
m += n; pret (n = m);
for (int i =0; i <= n; i ++) f[i] = g[i] =0;
for (int i =0; i < x.size (); i ++) f[i] = x[i];
for (int i =0; i < y.size (); i ++) g[i] = y[i];
NTT (f, 1, n); NTT (g, 1, n);
for (int i =0; i <= n; i ++) f[i] = f[i] *1ll* g[i] % P;
NTT (f, 0, n);
vector <int> ans (m +1);
for (int i =0; i <= m; i ++) ans[i] = f[i];
return ans;
}
vector <int>operator* (int coef, const vector <int>& x) {
auto res = x;
for (auto&tmp : res) tmp = tmp *1ll* coef % P;
return res;
}
vector <int> inv (const vector <int>& f) {
int n = f.size ();
if (n ==0) return {};
vector <int> g = { (int)qpow (f[0], P -2) };
int len =1;
while (len < n) {
len <<=1;
vector <int> bt (len);
for(int i =0; i < len && i < f.size (); i ++) bt[i] = f[i];
vector <int> term = bt * (g * g);
if (term.size () > len) term.resize (len);
g =2* g - term;
if (g.size () > len) g.resize (len);
}
g.resize (n);
return g;
}
vector <int> Integral (vector <int> f) {
f.push_back (0); int n = f.size ();
for (int i = n -1; i; i --) f[i] = f[i -1] *1ll* qpow (i, P -2) % P;
f[0] =0;
return f;
}
vector <int> Derivative (vector <int> f) {
int n = f.size ();
if (n ==1) return {0};
for (int i =0; i < n -1; i ++) f[i] = f[i +1] *1ll* (i +1) % P;
f.resize (n -1);
return f;
}
intbsgs (int n) {
if (n ==0) return0;
unordered_map <int, int> mp;
int m = ceil (sqrt (P -1));
ll base =1;
ll cur = n;
for (int j =0; j < m; j ++) {
mp[cur] = j;
cur = cur * GG % P;
}
ll step = qpow (GG, m), now =1;
for (int i =1; i <= m; i ++) {
now = now * step % P;
if (mp.count (now)) {
ll K = i *1ll* m - mp[now];
K = (K % (P -1) + (P -1)) % (P -1);
if (K %2!=0) return-1;
ll x = qpow (GG, K /2);
return min (1ll* x, P - x);
}
}
return-1;
}
vector <int> sqrt (const vector <int>& f) {
int n = f.size (), len =1;
vector <int> g = {bsgs (f[0])};
while (g.size () < n) {
len <<=1;
vector <int> ff (len);
g.resize (len);
for (int i =0; i < len && i < n; i ++) ff[i] = f[i];
auto prod = ff * inv (g); prod.resize (len);
g = inv2 * (g + prod);
}
g.resize (n);
return g;
}
vector <int> revPoly (const vector <int>& f) {
auto g = f; int sz = g.size ();
for (int i =0; i < sz /2; i ++) swap (g[i], g[sz - i -1]);
return g;
}
pair < vector <int>, vector <int>> divide (const vector <int>& f, const vector <int>& g) {
int n = f.size () -1, m = g.size () -1;
if (n < m) return { vector <int> (0), f };
auto rF = revPoly (f), rG = revPoly (g); rG.resize (n - m +1); rF.resize (n - m +1);
auto rQ = rF * inv (rG); rQ.resize (n - m +1);
auto Q = revPoly (rQ);
auto R = f - g * Q; R.resize (m);
while (!R.empty () &&!R.back ()) R.pop_back ();
return {Q, R};
}
vector <int> ln (const vector <int>& f) {
int n = f.size ();
auto dF = Derivative (f);
auto q = dF * inv (f);
auto res = Integral (q); res.resize (n);
return res;
}
vector <int> exp (const vector <int>& f) {
if (f.size () ==1) return {1};
vector <int> g, base = {1}; g = {1};
int len =1, n = f.size ();
while (len < n) {
len <<=1;
g.resize (len);
auto lng = ln (g);
g = g * (base + f - lng);
}
g.resize (n);
return g;
}
vector <int> power (const vector <int>& f, ll k1, ll k2, ll k3) {
int n = f.size ();
int lw =0;
while (lw < n &&!f[lw]) lw ++;
if (lw == n) return vector <int> (n, 0);
if (k3 ==0) { vector<int> res(n, 0); res[0] =1; return res; }
if (lw *1ll* k3 >= n) return vector <int> (n, 0);
vector <int> g;
for (int i = lw; i < n; i ++) g.push_back (f[i]);
g.resize (n - lw * k3);
int c = g[0];
int inc = qpow(c, P -2);
for (auto&x : g) x =1ll* x * inc % P;
g = qpow (c, k2) * exp (k1 * ln (g));
vector <int> ans (n, 0);
int fuckyou = lw * k3;
for (int i =0; i < g.size (); i ++) ans[i + fuckyou] = g[i];
return ans;
}
char st[N];
intmain (void) {
scanf ("%d%s", &n, st +1); n --;
f.resize (n +1);
for (int&x : f) scanf ("%d", &x);
ll k1 =0, k2 =0, k3 =0;
for (int i =1; st[i]; i ++) {
int d = st[i] -'0';
k1 = (k1 *10+ d) % P;
k2 = (k2 *10+ d) % (P -1);
if (k3 < n) k3 = k3 *10+ d;
}
auto ans = power (f, k1, k2, k3);
for (auto&x : ans) printf ("%d ", x);
puts ("");
return0;
}