func_code_string: #include <bits/stdc++.h>   using namespace std;   const int mod = 998244353;   inline int add(int x, int y) {     x += y;     return x >= mod ? x - mod : x;   }   inline int sub(int x, int y) {     x -= y;     return x < 0 ? x + mod : x;   }   inline int mul(int x, int y) { return 1ll * x * y % mod; }   int quick_pow(int x, int y) {     int res = 1;     while (y) {       if (y & 1) res = mul(res, x);       x = mul(x, x), y >>= 1;     }     return res;   }   inline int getinv(int x) { return quick_pow(x, mod - 2); }   const int maxk = 17;   const int maxn = 1 << 16 | 5;   int fac[maxk], ifac[maxk], inv[maxk];   void init(int N) {     fac[0] = 1;     for (int i = 1; i <= N; i++) fac[i] = mul(fac[i - 1], i);     ifac[N] = getinv(fac[N]);     for (int i = N; i >= 1; i--) ifac[i - 1] = mul(ifac[i], i);     inv[0] = inv[1] = 1;     for (int i = 2; i <= N; i++) inv[i] = mul(inv[mod % i], mod - mod / i);   }   int n, K, c;   map<vector<int>, int> Map;   void getln(int *A) {     static int B[maxk];     B[0] = 0;     for (int i = 1; i <= K; i++) {       int tmp = 0;       for (int j = 1; j < i; j++) tmp = add(tmp, mul(j, mul(B[j], A[i - j])));       B[i] = sub(A[i], mul(tmp, inv[i]));     }     for (int i = 0; i <= K; i++) A[i] = B[i];   }   void getexp(int *A) {     static int B[maxk];     B[0] = 1;     for (int i = 1; i <= K; i++) {       int tmp = 0;       for (int j = 0; j < i; j++) tmp = add(tmp, mul(mul(A[i - j], i - j), B[j]));       B[i] = mul(tmp, inv[i]);     }     for (int i = 0; i <= K; i++) A[i] = B[i];   }   int popcnt[maxn], A[maxn];   vector<int> num[205];   int cnt[205], sum[maxn << 1], tot;   int st[205], top;   int Ln[maxn][maxk];   int main() {     scanf( %d%d%d , &n, &K, &c), init(K);     int all = 0;     for (int i = 1, x; i <= n; i++) {       scanf( %d , &x), all ^= x;       vector<int> A;       for (int j = 1; j <= K; j++) A.push_back(x ^ (x - j));       Map[A]++;     }     for (auto u : Map) num[++tot] = u.first, cnt[tot] = u.second;     int S = (1 << K) - 1;     for (int i = 0; i <= S; i++) {       static int f[maxk];       f[0] = 1;       for (int j = 0; j < K; j++)         f[j + 1] = ((i >> j) & 1) ? mod - ifac[j + 1] : ifac[j + 1];       getln(f);       for (int j = 0; j <= K; j++) Ln[i][j] = f[j];     }     S = (1 << c) - 1;     for (int i = 1; i <= S; i++) popcnt[i] = popcnt[i >> 1] + (i & 1);     for (int i = 0; i <= S; i++) {       for (int j = 1; j <= tot; j++) {         int sta = 0;         for (int k = 0; k < K; k++)           if (popcnt[i & num[j][k]] & 1) sta |= (1 << k);         if (!sum[sta]) st[++top] = sta;         sum[sta] += cnt[j];       }       static int f[maxk], g[maxk], h[maxk];       for (int j = 0; j <= K; j++) f[j] = h[j] = 0;       f[0] = 1;       for (int j = 1; j <= top; j++) {         int sta = st[j];         for (int k = 0; k <= K; k++) g[k] = mul(Ln[sta][k], sum[sta]);         getexp(g);         for (int k = 0; k <= K; k++)           for (int l = 0; k + l <= K; l++)             h[k + l] = add(h[k + l], mul(f[k], g[l]));         for (int k = 0; k <= K; k++) f[k] = h[k], h[k] = 0;         sum[sta] = 0;       }       top = 0;       A[i] = mul(f[K], fac[K]);     }     int N = 1 << c;     for (int l = 2; l <= N; l <<= 1) {       int m = (l >> 1);       for (int j = 0; j < N; j += l)         for (int i = j; i < j + m; i++) {           int u = A[i], v = A[i + m];           A[i] = add(u, v);           A[i + m] = sub(u, v);         }     }     int tmp = getinv(mul(N, quick_pow(n, K)));     for (int i = 0; i < N; i++) printf( %d  , mul(A[i ^ all], tmp));     return 0;   }   