#include <bits/stdc++.h>
using namespace std;
const int MAXN = (1 << 18) + 5;
template <typename T>
inline void read(T &AKNOI) {
  T x = 0, flag = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') flag = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  AKNOI = flag * x;
}
namespace ModCalculator {
const int MOD = 998244353;
inline void Inc(int &x, int y) {
  x += y;
  if (x >= MOD) x -= MOD;
}
inline void Dec(int &x, int y) {
  x -= y;
  if (x < 0) x += MOD;
}
inline int Add(int x, int y) {
  Inc(x, y);
  return x;
}
inline int Sub(int x, int y) {
  Dec(x, y);
  return x;
}
inline int Mul(int x, int y) { return 1LL * x * y % MOD; }
inline int Ksm(int x, int k) {
  int ret = 1;
  for (; k; k >>= 1) {
    if (k & 1) ret = Mul(ret, x);
    x = Mul(x, x);
  }
  return ret;
}
inline int Inv(int x) { return Ksm(x, MOD - 2); }
}  // namespace ModCalculator
using namespace ModCalculator;
int n;
long long m;
int fac[MAXN], finv[MAXN];
int len, lenv, rev[MAXN], w1[MAXN], w2[MAXN];
int F[MAXN], G[MAXN];
void NTT_init(int m) {
  int bit = -1;
  for (len = 1; len <= m; len <<= 1, ++bit)
    ;
  lenv = Inv(len);
  for (int i = 0; i < len; ++i) {
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << bit);
  }
  int Gi = 3, Gv = Inv(Gi);
  for (int i = 1; i < len; i <<= 1) {
    int wn1 = Ksm(Gi, (MOD - 1) / (i << 1)), wk1 = 1;
    int wn2 = Ksm(Gv, (MOD - 1) / (i << 1)), wk2 = 1;
    for (int k = 0; k < i; ++k) {
      w1[i + k] = wk1;
      wk1 = Mul(wk1, wn1);
      w2[i + k] = wk2;
      wk2 = Mul(wk2, wn2);
    }
  }
}
void NTT(int *a, int type) {
  int *w = (type == 1 ? w1 : w2);
  for (int i = 0; i < len; ++i) {
    if (i < rev[i]) {
      swap(a[i], a[rev[i]]);
    }
  }
  for (int i = 1; i < len; i <<= 1) {
    for (int j = 0; j < len; j += (i << 1)) {
      for (int k = 0; k < i; ++k) {
        int x = a[j + k], y = Mul(w[i + k], a[j + k + i]);
        a[j + k] = Add(x, y);
        a[j + k + i] = Sub(x, y);
      }
    }
  }
  if (type == 1) return;
  for (int i = 0; i < len; ++i) {
    a[i] = Mul(a[i], lenv);
  }
}
void init() {
  read(n);
  read(m);
  fac[0] = 1;
  for (int i = 1; i <= n; ++i) {
    fac[i] = Mul(fac[i - 1], i);
  }
  finv[n] = Inv(fac[n]);
  for (int i = n; i >= 1; --i) {
    finv[i - 1] = Mul(finv[i], i);
  }
  NTT_init(n << 1);
}
void solve() {
  for (int i = 0; i <= n; ++i) {
    read(F[i]);
    F[i] = Mul(F[i], fac[i]);
    G[i] = finv[i];
  }
  reverse(F, F + n + 1);
  NTT(F, 1);
  NTT(G, 1);
  for (int i = 0; i < len; ++i) {
    G[i] = Mul(F[i], G[i]);
  }
  NTT(G, -1);
  reverse(G, G + n + 1);
  for (int i = 0; i <= n; ++i) {
    G[i] = Mul(G[i], Inv(Ksm(i + 1, m % (MOD - 1))));
    F[i] = ((i & 1) ? MOD - finv[i] : finv[i]);
  }
  for (int i = n + 1; i < len; ++i) {
    F[i] = G[i] = 0;
  }
  reverse(G, G + n + 1);
  NTT(F, 1);
  NTT(G, 1);
  for (int i = 0; i < len; ++i) {
    F[i] = Mul(F[i], G[i]);
  }
  NTT(F, -1);
  reverse(F, F + n + 1);
  for (int i = 0; i <= n; ++i) {
    printf("%d ", Mul(F[i], finv[i]));
  }
}
int main() {
  init();
  solve();
  return 0;
}
