#include <bits/stdc++.h>
using namespace std;
const int BUF_SIZE = 1 << 12;
char buf[BUF_SIZE], *buf_s = buf, *buf_t = buf + 1;
template <typename _n_>
void mian(_n_ &_x_) {
  while (*buf_s != '-' && !isdigit(*buf_s)) {
    buf_s++;
    if (buf_s == buf_t) {
      buf_s = buf;
      buf_t = buf + fread(buf, 1, BUF_SIZE, stdin);
    }
  };
  bool register _nega_ = false;
  if (*buf_s == '-') {
    _nega_ = true;
    {
      buf_s++;
      if (buf_s == buf_t) {
        buf_s = buf;
        buf_t = buf + fread(buf, 1, BUF_SIZE, stdin);
      }
    };
  }
  _x_ = 0;
  while (isdigit(*buf_s)) {
    _x_ = _x_ * 10 + *buf_s - '0';
    {
      buf_s++;
      if (buf_s == buf_t) {
        buf_s = buf;
        buf_t = buf + fread(buf, 1, BUF_SIZE, stdin);
      }
    };
  }
  if (_nega_) _x_ = -_x_;
}
const int kato = 2e6 + 10;
template <typename _n_>
bool cmax(_n_ &a, const _n_ &b) {
  return a < b ? a = b, 1 : 0;
}
template <typename _n_>
bool cmin(_n_ &a, const _n_ &b) {
  return a > b ? a = b, 1 : 0;
}
long long n, m, len = 1;
long long f[kato], g[kato], fac[kato], inv[kato], fac_inv[kato];
inline long long quick_pow(long long a, long long b) {
  long long res = 1;
  for (; b; b >>= 1, a = a * a % 998244353) {
    if (b & 1) {
      res = res * a % 998244353;
    }
  }
  return res;
}
inline void NTT(long long *y, int len, int opt) {
  int *rev = new int[len];
  rev[0] = 0;
  for (int i = 1; i < len; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) * (len >> 1));
  for (int i = 0; i < len; i++)
    if (rev[i] > i) swap(y[rev[i]], y[i]);
  for (int i = 1; i < len; i <<= 1) {
    int G1 = quick_pow(3, (998244353 - 1) / (i << 1));
    for (int j = 0; j < len; j += (i << 1)) {
      for (int k = 0, g = 1; k < i; k++, g = 1LL * g * G1 % 998244353) {
        int res = 1LL * y[i + j + k] * g % 998244353;
        y[i + j + k] = ((y[j + k] - res) % 998244353 + 998244353) % 998244353;
        y[j + k] = (y[j + k] + res) % 998244353;
      }
    }
  }
  if (opt == -1) {
    reverse(y + 1, y + len);
    for (int i = 0, inv = quick_pow(len, 998244353 - 2); i < len; i++)
      y[i] = 1LL * y[i] * inv % 998244353;
  }
  delete[] rev;
  rev = 0x0;
}
inline int Ame_() {
  mian(n), mian(m);
  {
    fac[0] = fac[1] = inv[0] = inv[1] = fac_inv[0] = fac_inv[1] = 1;
    for (int i = 2; i <= n; i++) {
      fac[i] = 1LL * fac[i - 1] * i % 998244353;
      inv[i] =
          1LL * (998244353 - 998244353 / i) * inv[998244353 % i] % 998244353;
      fac_inv[i] = 1LL * fac_inv[i - 1] * inv[i] % 998244353;
    }
  };
  for (int i = 0; i <= n; i++)
    mian(f[n - i]), f[n - i] = f[n - i] * fac[i] % 998244353, g[i] = fac_inv[i];
  for (len = 1; len <= 2 * (n + 1); len <<= 1)
    ;
  NTT(f, len, 1);
  NTT(g, len, 1);
  for (int i = 0; i < len; i++) g[i] = 1LL * g[i] * f[i] % 998244353;
  NTT(g, len, -1);
  for (int i = n + 1; i <= len; i++) g[i] = 0;
  for (int i = 0; i <= n; i++)
    g[n - i] =
        g[n - i] * quick_pow(quick_pow(i + 1, m), 998244353 - 2) % 998244353;
  for (int i = 0; i < len; i++) f[i] = 0;
  for (int i = 0; i <= n; i++) f[i] = (i & 1) ? -fac_inv[i] : fac_inv[i];
  NTT(f, len, 1);
  NTT(g, len, 1);
  for (int i = 0; i < len; i++) f[i] = 1LL * f[i] * g[i] % 998244353;
  NTT(f, len, -1);
  for (int i = 0; i <= n; i++)
    fprintf(stdout, "%lld ", f[n - i] * fac_inv[i] % 998244353);
  return ~~(0 ^ 0 ^ 0);
}
int Ame__ = Ame_();
int main() { ; }
