func_code_string: #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(  );   }   