#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353, N = 1e5;
int cnt[200], seq[200][17], fac[20], inv[20], ifac[20], popcnt[N], ln[N][17],
    tmp[N][17], ans[N], finalans[N], w[N], n, K, c;
int qmod1(const int &x) { return x >= mod ? x - mod : x; }
int qmod2(const int &x) { return x + (x >> 31 & mod); }
int qpower(int a, int b) {
  int ans = 1;
  for (; b; b >>= 1, a = 1ll * a * a % mod)
    if (b & 1) ans = 1ll * ans * a % mod;
  return ans;
}
void prework(int n) {
  fac[0] = ifac[0] = 1;
  for (int i = 1; i <= n; i++) fac[i] = 1ll * fac[i - 1] * i % mod;
  inv[1] = 1;
  for (int i = 2; i <= n; i++)
    inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
  for (int i = 1; i <= n; i++) ifac[i] = 1ll * ifac[i - 1] * inv[i] % mod;
  for (int i = 1; i < (1 << 16); i++) popcnt[i] = popcnt[i >> 1] + (i & 1);
}
struct Basis {
  int size, a[20], id[20];
  void clear() {
    for (int i = 0; i < c; i++) a[i] = 0, id[i] = -1;
    size = 0;
  }
  void ins(int x) {
    for (int i = c - 1; i >= 0; i--)
      if (x >> i & 1) {
        if (!a[i]) {
          a[i] = x, id[i] = size++;
          return;
        }
        x ^= a[i];
      }
  }
  int get(int x) {
    int ans = 0;
    for (int i = c - 1; i >= 0; i--)
      if (a[i] && (x >> i & 1)) ans ^= 1 << id[i], x ^= a[i];
    return ans;
  }
  int iget(int x) {
    int ans = 0;
    for (int i = c - 1; i >= 0; i--)
      if (a[i] && (x >> id[i] & 1)) ans ^= a[i];
    return ans;
  }
} xxj;
int main() {
  scanf("%d%d%d", &n, &K, &c);
  prework(K);
  int wsum = 0;
  int seqn = 0;
  map<unsigned long long, int> mp;
  for (int i = 1; i <= n; i++) {
    scanf("%d", w + i);
    wsum ^= w[i];
    int tmpseq[17];
    for (int j = 1; j <= K; j++) tmpseq[j] = w[i] ^ (w[i] - j);
    unsigned long long hsh = 0;
    for (int j = 1; j <= K; j++) hsh = hsh * 19260817 + tmpseq[j] + 233;
    if (!mp[hsh]) {
      ++seqn;
      copy(tmpseq + 1, tmpseq + K + 1, seq[seqn] + 1);
      mp[hsh] = seqn;
      cnt[seqn] = 1;
    } else
      cnt[mp[hsh]]++;
  }
  for (int T = 1, tS[17]; T <= seqn; T++) {
    xxj.clear();
    for (int i = 1; i <= K; i++) xxj.ins(seq[T][i]);
    int B = xxj.size;
    for (int i = 1; i <= K; i++) tS[i] = xxj.get(seq[T][i]);
    for (int S = 0; S < (1 << B); S++) fill(tmp[S], tmp[S] + K + 1, 0);
    for (int i = 1; i <= K; i++) {
      for (int S = 0; S < (1 << B); S++) {
        unsigned long long t = 0;
        for (int j = 1; j <= i; j++)
          t += 1ull * tmp[S ^ tS[j]][i - j] * ifac[j];
        tmp[S][i] = qmod2(-(int)(t % mod));
      }
      tmp[tS[i]][i] = qmod1(tmp[tS[i]][i] + ifac[i - 1]);
    }
    for (int S = 0, rS; S < (1 << B); S++) {
      rS = xxj.iget(S);
      for (int i = 1; i <= K; i++)
        ln[rS][i] = (ln[rS][i] + 1ull * cnt[T] * tmp[S][i]) % mod;
    }
  }
  for (int i = 1, tmp[17]; i < (1 << c); i <<= 1)
    for (int j = 0; j < (1 << c); j += i << 1)
      for (int k = 0; k < i; k++) {
        int *a = ln[j + k], *b = ln[i + j + k];
        copy(b, b + K + 1, tmp);
        for (int t = 0; t <= K; t++)
          b[t] = qmod2(a[t] - b[t]), a[t] = qmod1(a[t] + tmp[t]);
      }
  for (int S = 0, f[17], g[17]; S < (1 << c); S++) {
    copy(ln[S], ln[S] + K + 1, f);
    g[0] = 1;
    for (int i = 1; i <= K; i++) {
      unsigned long long t = 0;
      for (int j = 1; j <= i; j++) t += 1ull * f[j] * g[i - j];
      g[i] = t % mod * inv[i] % mod;
    }
    ans[S] = 1ll * g[K] * fac[K] % mod;
  }
  for (int i = 1; i < (1 << c); i <<= 1)
    for (int j = 0; j < (1 << c); j += i << 1)
      for (int k = 0; k < i; k++) {
        int t = ans[i + j + k];
        ans[i + j + k] = qmod2(ans[j + k] - t),
                    ans[j + k] = qmod1(ans[j + k] + t);
      }
  int iv = mod - ((mod - 1) >> c);
  iv = 1ll * iv * qpower(n, mod - 1 - K) % mod;
  for (int i = 0; i < (1 << c); i++) ans[i] = 1ll * ans[i] * iv % mod;
  for (int i = 0; i < (1 << c); i++) finalans[i ^ wsum] = ans[i];
  for (int i = 0; i < (1 << c); i++) printf("%d ", finalans[i]);
  puts("");
}
