#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5, maxf = 2.7e5;
const int mod = 998244353;
int n;
long long m;
int P[maxf + 5], G[maxf + 5];
namespace usual {
int fac[maxf + 5], ifac[maxf + 5];
void readn(int &num) {
  char c = getchar();
  while (c < '0' || c > '9') c = getchar();
  for (num = 0; c >= '0' && c <= '9'; num = num * 10 + c - '0', c = getchar())
    ;
}
int add(int ta, int tb) { return ta + tb >= mod ? ta + tb - mod : ta + tb; }
int sub(int ta, int tb) { return ta < tb ? ta - tb + mod : ta - tb; }
int ksm(long long ta, int tp) {
  int s = 1;
  for (; tp; ta = ta * ta % mod, tp >>= 1)
    if (tp & 1) s = ta * s % mod;
  return s;
}
void make_fac() {
  fac[0] = 1;
  for (int i = 1; i <= n + 1; i++) fac[i] = 1ll * fac[i - 1] * i % mod;
  ifac[n + 1] = ksm(fac[n + 1], mod - 2);
  for (int i = n + 1; i; i--) ifac[i - 1] = 1ll * ifac[i] * i % mod;
}
int inv(int tn) { return 1ll * ifac[tn] * fac[tn - 1] % mod; }
}  // namespace usual
using namespace usual;
namespace poly {
int pa[maxf + 5], pb[maxf + 5];
int g[maxf + 5], invg[maxf + 5], rev[maxf + 5];
void Cpy(int *A, int *B, int len) {
  for (int i = 0; i < len; i++) A[i] = B[i];
}
void Rev(int *A, int len) {
  for (int i = 0; i < len - i - 1; i++) swap(A[i], A[len - i - 1]);
}
void Cl(int *A, int len) { memset(A, 0, len * 4); }
void make_tt(int *T, int len, int da) {
  int tmp = ksm(da, (mod - 1) / len);
  for (int i = len >> 1; i; i >>= 1, tmp = 1ll * tmp * tmp % mod) {
    T[i] = 1;
    for (int j = 1; j < i; j++) T[i + j] = 1ll * T[i + j - 1] * tmp % mod;
  }
}
void pre_poly(int len) {
  make_tt(g, len, 3);
  make_tt(invg, len, 332748118);
}
void make_rev(int len) {
  for (int i = 1; i < len; i++)
    rev[i] = (rev[i >> 1] >> 1) | (i & 1 ? len >> 1 : 0);
}
void NTT(int *T, int len, bool ok) {
  int *tt, ny;
  for (int i = 1; i < len; i++)
    if (i < rev[i]) swap(T[i], T[rev[i]]);
  for (int i = 1; i < len; i <<= 1) {
    tt = ok ? g + i : invg + i;
    for (int j = 0; j < len; j += i << 1)
      for (int l = 0; l < i; l++) {
        ny = 1ll * T[i + j + l] * tt[l] % mod;
        T[i + j + l] = sub(T[j + l], ny);
        T[j + l] = add(T[j + l], ny);
      }
  }
}
void Mult(int *A, int *B, int *C, int len) {
  Cpy(pa, A, len);
  Cpy(pb, B, len);
  make_rev(len);
  NTT(pa, len, 1);
  NTT(pb, len, 1);
  for (int i = 0; i < len; i++) pa[i] = 1ll * pa[i] * pb[i] % mod;
  NTT(pa, len, 0);
  int invn = ksm(len, mod - 2);
  for (int i = 0; i < len; i++) C[i] = 1ll * pa[i] * invn % mod;
}
}  // namespace poly
using namespace poly;
int main() {
  int len = 1;
  scanf("%d %lld", &n, &m);
  m %= mod - 1;
  for (int i = 0; i <= n; i++) readn(P[i]);
  make_fac();
  pre_poly(1 << 18);
  for (int i = 0; i <= n; i++) P[i] = 1ll * P[i] * fac[i] % mod;
  for (int i = 0; i <= n; i++) G[i] = ifac[i];
  while (len <= n * 2) len <<= 1;
  Rev(P, n + 1);
  Mult(P, G, P, len);
  Cl(P + n + 1, len - n - 1);
  Rev(P, n + 1);
  for (int i = 0; i <= n; i++)
    P[i] = 1ll * P[i] * ifac[i] % mod * ksm(inv(i + 1), m) % mod;
  for (int i = 0; i <= n; i++)
    if (i & 1)
      P[i] = sub(0, 1ll * P[i] * fac[i] % mod);
    else
      P[i] = 1ll * P[i] * fac[i] % mod;
  Rev(P, n + 1);
  Mult(P, G, P, len);
  Cl(P + n + 1, len - n - 1);
  Rev(P, n + 1);
  for (int i = 0; i <= n; i++) {
    if (i & 1)
      P[i] = sub(0, 1ll * P[i] * ifac[i] % mod);
    else
      P[i] = 1ll * P[i] * ifac[i] % mod;
    printf("%d ", P[i]);
  }
  printf("\n");
  return 0;
}
