#include <bits/stdc++.h>   using namespace std;   template <typename T>   inline bool uax(T &x, T y) {     return (y > x) ? x = y, true : false;   }   template <typename T>   inline bool uin(T &x, T y) {     return (y < x) ? x = y, true : false;   }   string to_string(char c) { return     + string(1, c) +    ; }   string to_string(string s) { return     + s +    ; }   string to_string(const char *s) { return to_string((string)s); }   template <typename A>   string to_string(A);   template <typename A, typename B>   string to_string(pair<A, B> p) {     return  (  + to_string(p.first) +  :   + to_string(p.second) +  ) ;   }   template <typename A>   string to_string(A v) {     bool f = false;     string r =  { ;     for (auto x : v) {       if (f) r +=  ,  ;       r += to_string(x);       f = true;     }     return r +=  } ;   }   template <typename A>   string to_string(vector<vector<A>> v) {     string r;     for (auto x : v) r +=   n  + to_string(x);     return r;   }   int Nerr;   template <typename A>   string to_string(A *p) {     return to_string(vector<A>(p, p + Nerr));   }   void err(istream_iterator<string>) { cerr << endl; }   template <typename T, typename... Args>   void err(istream_iterator<string> it, T a, Args... args) {     cerr << *it <<   =:   << to_string(a) <<  ;  ;     err(++it, args...);   }   template <typename T>   void kek(T ans) {     cout << ans << endl;     exit(0);   }   long long const INF = 1e18 + 42;   const int MOD = 998244353;   inline int add(int a, int b, int mod = MOD) {     a += b;     return a >= mod ? a - mod : a;   }   inline int sub(int a, int b, int mod = MOD) {     a -= b;     return a < 0 ? a + mod : a;   }   inline int mul(int a, int b, int mod = MOD) {     return int((long long)a * b % mod);   }   inline int mpow(int base, long long ex, int mod = MOD) {     int res = 1;     for (; ex > 0; ex >>= 1) {       if (ex & 1) res = mul(res, base, mod);       base = mul(base, base, mod);     }     return res;   }   inline int inv(int a, int mod = MOD) { return mpow(a, mod - 2, mod); }   inline int mdiv(int a, int b, int mod = MOD) {     return mul(a, mpow(b, mod - 2, mod));   }   inline void adds(int &a, int b, int mod = MOD) {     a += b;     if (a >= mod) a -= mod;   }   inline void subs(int &a, int b, int mod = MOD) {     a -= b;     if (a < 0) a += mod;   }   inline void muls(int &a, int b, int mod = MOD) {     a = int((long long)a * b % mod);   }   inline void mdivs(int &a, int b, int mod = MOD) { a = mdiv(a, b, mod); }   template <typename T, int K>   struct Basis {     array<T, K> bas;     int n, rank;     Basis() : bas(), n(), rank() {}     bool add(T x) {       ++n;       for (int i = K - 1; i >= 0; --i) {         if (x >> i & 1) {           if (bas[i]) {             x ^= bas[i];           } else {             bas[i] = x, ++rank;             return true;           }         }       }       return false;     }     int ways(T x) {       for (int i = K - 1; i >= 0; --i) {         if (x >> i & 1) x ^= bas[i];       }       return x == 0 ? mpow(2, n - rank) : 0;     }     Basis operator+(Basis o) const {       for (int i = 0; i < K; ++i)         if (bas[i]) o.add(bas[i]);       return o;     }   };   int32_t main() {     cin.tie(nullptr)->sync_with_stdio(false);     const int M = 35, F = 13, S = M - F;     int n, m;     cin >> n >> m;     Basis<long long, M> basis;     for (int i = 0; i < n; ++i) {       long long x;       cin >> x;       basis.add(x);     }     42;     ;     set<long long> s, t;     for (int nask = 0; nask < (1 << F); ++nask) {       long long val = 0;       for (int i = 0; i < F; ++i)         if (nask >> i & 1) {           val ^= basis.bas[i];         }       s.insert(val);     }     42;     ;     for (int nask = 0; nask < (1 << S); ++nask) {       long long val = 0;       for (int i = 0; i < S; ++i)         if (nask >> i & 1) {           val ^= basis.bas[i + F];         }       t.insert(val);     }     42;     ;     array<array<int, (1 << F)>, F + 1> dp{};     for (auto &v : dp) fill(begin(v), end(v), -1);     auto calc = [&](int b, int nask) {       if (~dp[b][nask]) return dp[b][nask];       for (int i = 0; i <= F; ++i) dp[i][nask] = 0;       for (long long x : s) ++dp[__builtin_popcountll(x ^ nask)][nask];       return dp[b][nask];     };     vector<int> ans(m + 1);     for (long long x : t) {       long long rt = x & ((1 << F) - 1);       long long lf = x - rt;       int cnt = __builtin_popcountll(lf);       for (int i = 0; i <= F; ++i) {         adds(ans[cnt + i], calc(i, (int)rt));       }     }     const int pw = mpow(2, n - basis.rank);     for (int x : ans) {       cout << mul(x, pw) <<    ;     }     cout <<   n ;   }