#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 19;
const int LGN = 19;
const int P = 998244353;
const int G = 3;
long long fact[N + 3];
long long finv[N + 3];
long long a[N + 3];
long long b[N + 3];
long long c[N + 3];
long long d[N + 3];
long long e[N + 3];
long long f[N + 3];
long long g[N + 3];
long long fftid[N + 3];
long long tmp1[N + 3], tmp2[N + 3];
int n;
long long m;
long long quickpow(long long x, long long y) {
  long long cur = x, ret = 1ll;
  for (int i = 0; y; i++) {
    if (y & (1ll << i)) {
      ret = ret * cur % P;
      y -= (1ll << i);
    }
    cur = cur * cur % P;
  }
  return ret;
}
long long mulinv(long long x) {
  return x <= N ? finv[x] * fact[x - 1] % P : quickpow(x, P - 2);
}
void init_fftid(int dgr) {
  int len = 0;
  for (int i = 0; i <= LGN; i++)
    if (dgr == (1 << i)) {
      len = i;
      break;
    }
  fftid[0] = 0ll;
  for (int i = 1; i < dgr; i++)
    fftid[i] = ((fftid[i >> 1]) >> 1) | ((i & 1) << (len - 1));
}
int getdgr(int x) {
  int ret = 1;
  while (ret < x) ret <<= 1;
  return ret;
}
void ntt(int dgr, int coe, long long poly[], long long ret[]) {
  init_fftid(dgr);
  for (int i = 0; i < dgr; i++) ret[i] = poly[i];
  for (int i = 0; i < dgr; i++)
    if (i < fftid[i]) swap(ret[i], ret[fftid[i]]);
  for (int i = 1; i <= (dgr >> 1); i <<= 1) {
    long long tmp = quickpow(G, (P - 1) / (i << 1));
    if (coe == -1) tmp = mulinv(tmp);
    for (int j = 0; j < dgr; j += (i << 1)) {
      long long expn = 1ll;
      for (int k = 0; k < i; k++) {
        long long x = ret[k + j], y = ret[k + i + j] * expn % P;
        ret[k + j] = x + y;
        {
          if (ret[k + j] >= P) ret[k + j] -= P;
        };
        ret[k + i + j] = x - y + P;
        {
          if (ret[k + i + j] >= P) ret[k + i + j] -= P;
        };
        expn = expn * tmp % P;
      }
    }
  }
  if (coe == -1) {
    long long tmp = mulinv(dgr);
    for (int i = 0; i < dgr; i++) ret[i] = ret[i] * tmp % P;
  }
}
int main() {
  fact[0] = 1ll;
  for (int i = 1; i <= N; i++) fact[i] = fact[i - 1] * i % P;
  finv[N] = quickpow(fact[N], P - 2);
  for (int i = N - 1; i >= 0; i--) finv[i] = finv[i + 1] * (i + 1) % P;
  scanf("%d%I64d", &n, &m);
  for (int i = 0; i <= n; i++) scanf("%I64d", &a[i]);
  for (int i = 0; i <= n; i++) {
    b[i] = mulinv(i + 1);
    b[i] = quickpow(b[i], m);
  }
  int _dgr = n + 1, dgr = getdgr(_dgr);
  for (int i = 0; i < _dgr; i++) d[i] = fact[i] * a[i] % P;
  for (int i = 0; i < _dgr - 1 - i; i++) swap(d[i], d[_dgr - 1 - i]);
  for (int i = 0; i < _dgr; i++) e[i] = finv[i];
  for (int i = 0; i < _dgr; i++)
    f[i] = (i & 1) == 0 ? finv[i] : (P - finv[i]) % P;
  ntt(dgr << 1, 1, d, tmp1);
  ntt(dgr << 1, 1, e, tmp2);
  for (int i = 0; i < (dgr << 1); i++) tmp1[i] = tmp1[i] * tmp2[i] % P;
  ntt(dgr << 1, -1, tmp1, c);
  for (int i = _dgr; i < (dgr << 1); i++) c[i] = 0ll;
  for (int i = 0; i < _dgr - 1 - i; i++) swap(c[i], c[_dgr - 1 - i]);
  for (int i = 0; i < dgr; i++) c[i] = c[i] * finv[i] % P;
  for (int i = 0; i < _dgr; i++) c[i] = c[i] * b[i] % P;
  for (int i = 0; i < _dgr; i++) d[i] = fact[i] * c[i] % P;
  for (int i = 0; i < _dgr - 1 - i; i++) swap(d[i], d[_dgr - 1 - i]);
  ntt(dgr << 1, 1, d, tmp1);
  ntt(dgr << 1, 1, f, tmp2);
  for (int i = 0; i < (dgr << 1); i++) tmp1[i] = tmp1[i] * tmp2[i] % P;
  ntt(dgr << 1, -1, tmp1, g);
  for (int i = 0; i < _dgr - 1 - i; i++) swap(g[i], g[_dgr - 1 - i]);
  for (int i = 0; i < dgr; i++) g[i] = g[i] * finv[i] % P;
  for (int i = 0; i <= n; i++) printf("%I64d ", g[i]);
  return 0;
}
