#include <bits/stdc++.h>
using namespace std;
const int M = 998244353, Maxn = 400010;
int n, inv[Maxn], fac[Maxn], ifac[Maxn], f[Maxn], g[Maxn], A[Maxn], B[Maxn];
long long m;
int read() {
  int ret = 0;
  char c = getchar();
  while (c < '0' || c > '9') c = getchar();
  while (c >= '0' && c <= '9') {
    ret = ret * 10 + c - '0';
    c = getchar();
  }
  return ret;
}
int mo2(int x) { return (x < 0) ? x + M : x; }
int mo(long long x) { return mo2(x % M); }
void init() {
  inv[1] = 1;
  for (int i = 2; i < Maxn; i++) inv[i] = M - 1ll * inv[M % i] * (M / i) % M;
  fac[0] = ifac[0] = 1;
  for (int i = 1; i < Maxn; i++) {
    fac[i] = 1ll * fac[i - 1] * i % M;
    ifac[i] = 1ll * ifac[i - 1] * inv[i] % M;
  }
}
int fpow(int a, long long p) {
  int ret = 1;
  while (p) {
    if (p & 1) ret = 1ll * ret * a % M;
    p >>= 1;
    a = 1ll * a * a % M;
  }
  return ret;
}
namespace POLY {
vector<int> w[30];
int inv[Maxn];
struct Init {
  Init() {
    inv[1] = 1;
    for (int i = 2; i < Maxn; i++)
      inv[i] = (-1ll * (M / i) * inv[M % i] % M + M) % M;
    for (int l = 1; l <= 20; l++) {
      w[l].resize(1 << (l - 1));
      w[l][0] = 1;
      int wn = fpow(3, (M - 1) >> l);
      for (int i = 1; i < w[l].size(); i++)
        w[l][i] = 1ll * w[l][i - 1] * wn % M;
    }
  }
} Initer;
void NTT(int a[], int n, int t) {
  for (int i = 0, pos = 0; i < n; i++) {
    if (i < pos) swap(a[i], a[pos]);
    for (int p = n >> 1; (pos ^= p) < p; p >>= 1)
      ;
  }
  for (int mid = 1, p = 1; mid < n; mid <<= 1, p++)
    for (int i = 0; i < n; i += (mid << 1))
      for (int j = i, *wn = &w[p][0]; j < i + mid; j++, wn++) {
        int x = a[j], y = 1ll * a[j + mid] * (*wn) % M;
        a[j] = (x + y >= M) ? x + y - M : x + y;
        a[j + mid] = (x - y < 0) ? x - y + M : x - y;
      }
  if (t == -1) {
    reverse(a + 1, a + n);
    for (int i = 0; i < n; i++) a[i] = 1ll * a[i] * inv[n] % M;
  }
}
void Mul(int a[], int b[], int c[], int n, int m) {
  static int x[Maxn], y[Maxn];
  memcpy(x, a, sizeof(int) * n);
  memset(x + n, 0, sizeof(int) * n);
  memcpy(y, b, sizeof(int) * n);
  memset(y + n, 0, sizeof(int) * n);
  NTT(x, n << 1, 1);
  NTT(y, n << 1, 1);
  for (int i = 0; i < (n << 1); i++) x[i] = 1ll * x[i] * y[i] % M;
  NTT(x, n << 1, -1);
  memcpy(c, x + m, sizeof(int) * n);
}
}  // namespace POLY
int main() {
  init();
  scanf("%d%lld", &n, &m);
  int N = 1;
  for (; N <= n; N <<= 1)
    ;
  for (int i = 0; i <= n; i++) scanf("%d", f + i);
  for (int i = 0; i <= n; i++)
    A[i] = 1ll * fac[i] * f[i] % M, B[n - i] = ifac[i];
  POLY::Mul(A, B, g, N, n);
  for (int i = 0; i <= n; i++) g[i] = 1ll * ifac[i] * g[i] % M;
  for (int i = 0; i <= n; i++) g[i] = 1ll * g[i] * fpow(inv[i + 1], m) % M;
  for (int i = 0; i <= n; i++)
    A[i] = mo(((i & 1) ? -1ll : 1ll) * fac[i] * g[i]), B[n - i] = ifac[i];
  POLY::Mul(A, B, f, N, n);
  for (int i = 0; i <= n; i++)
    f[i] = mo(((i & 1) ? -1ll : 1ll) * ifac[i] * f[i]);
  for (int i = 0; i <= n; i++) printf("%d ", f[i]);
  return 0;
}
