#include <bits/stdc++.h>   using namespace std;   template <typename T>   inline T read() {     T f = 0, x = 0;     char c = getchar();     while (!isdigit(c)) f = c ==  - , c = getchar();     while (isdigit(c)) x = x * 10 + c - 48, c = getchar();     return f ? -x : x;   }   namespace run {   const int mod = 998244353, N = 1 << 16, inv2 = (mod + 1) / 2;   inline int add(int x, int y) { return x + y >= mod ? x - mod + y : x + y; }   inline int sub(int x, int y) { return x >= y ? x - y : x + mod - y; }   inline int qpow(int x, int y) {     int ret = 1;     while (y) {       if (y & 1) ret = 1LL * x * ret % mod;       x = 1LL * x * x % mod, y >>= 1;     }     return ret;   }   int inv[17], fac[17], ifac[17];   inline void Getln(int *a, int *b, int len) {     assert(a[0] == 1), b[0] = 0;     for (int i = 0; i < len - 1; i++) {       int sum = 1LL * a[i + 1] * (i + 1) % mod;       for (int j = 0; j < i; j++)         sum = sub(sum, 1LL * a[i - j] * (j + 1) % mod * b[j + 1] % mod);       b[i + 1] = 1LL * sum * inv[i + 1] % mod;     }   }   inline void Getexp(int *a, int *b, int len) {     assert(a[0] == 0), b[0] = 1;     for (int i = 0; i < len - 1; i++) {       b[i + 1] = 0;       for (int j = 0; j <= i; j++)         b[i + 1] = (1LL * (j + 1) * a[j + 1] % mod * b[i - j] + b[i + 1]) % mod;       b[i + 1] = 1LL * inv[i + 1] * b[i + 1] % mod;     }   }   inline void fwt_xor(int *a, int inv, int limit) {     for (int mid = 1; mid < limit; mid <<= 1)       for (int i = 0; i < limit; i += (mid << 1))         for (int j = 0; j < mid; j++) {           int x = a[i + j], y = a[i + j + mid];           if (inv == -1) x = 1LL * inv2 * x % mod, y = 1LL * inv2 * y % mod;           a[i + j] = add(x, y), a[i + j + mid] = sub(x, y);         }   }   int a[N], n, f[N], K, C, vis[N];   map<vector<int>, int> mp;   vector<int> st[209];   int count[N], tot, top, num[209], r[209], A[209];   int main() {     n = read<int>(), K = read<int>(), C = read<int>();     inv[0] = inv[1] = fac[0] = ifac[0] = ifac[1] = 1, count[0] = 0;     for (int i = 1; i <= K; i++) fac[i] = 1LL * fac[i - 1] * i % mod;     for (int i = 2; i <= K; i++)       inv[i] = 1LL * (mod - mod / i) * inv[mod % i] % mod,       ifac[i] = 1LL * inv[i] * ifac[i - 1] % mod;     for (int i = 1; i < 1 << C; i++) count[i] = count[i >> 1] + (i & 1);     int xorsum = 0;     for (int i = 0; i < n; i++) xorsum ^= (a[i] = read<int>());     for (int i = 0; i < n; i++) {       vector<int> b;       for (int j = 0; j <= K; j++) b.push_back(a[i] ^ (a[i] - j));       mp[b]++;     }     for (map<vector<int>, int>::iterator i = mp.begin(); i != mp.end(); i++)       st[++top] = i->first, num[top] = i->second;     for (int s = 0; s < 1 << C; s++) {       tot = 0;       for (int i = 1; i <= top; i++) {         int tmp = 0;         for (int j = 0; j <= K; j++) tmp = (tmp << 1) | (count[st[i][j] & s] & 1);         if (!vis[tmp])           A[++tot] = tmp, r[tot] = num[i], vis[tmp] = tot;         else           r[vis[tmp]] += num[i];       }       static int c[17], d[17], ret[17];       memset(ret, 0, sizeof ret);       for (int i = 1; i <= tot; i++) {         for (int j = 0; j <= K; j++)           c[j] = (A[i] >> (K - j) & 1) ? mod - ifac[j] : ifac[j];         Getln(c, d, K + 1);         for (int j = 0; j <= K; j++) ret[j] = (1LL * d[j] * r[i] + ret[j]) % mod;         vis[A[i]] = 0;       }       Getexp(ret, c, K + 1), f[s] = 1LL * c[K] * fac[K] % mod;     }     fwt_xor(f, -1, 1 << C);     int p = qpow(qpow(n, K), mod - 2);     for (int i = 0; i < 1 << C; i++)       printf( %lld  , 1LL * f[i ^ xorsum] * p % mod);     return 0;   }   }  // namespace run   int main() { return run::main(); }