#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;
  }
};
const int M = 35, F = 13, S = M - F;
array<int, (1 << S)> pc{};
int32_t main() {
  cin.tie(nullptr)->sync_with_stdio(false);
  for (int i = 1; i < (1 << S); ++i) {
    pc[i] = pc[i >> 1] + (i & 1);
  }
  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);
  }
  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);
  }
  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);
  }
  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[pc[x ^ nask]][nask];
    return dp[b][nask];
  };
  vector<int> ans(M + 1);
  for (long long x : t) {
    long long rt = x & ((1 << F) - 1);
    int cnt = pc[(x ^ rt) >> F];
    for (int i = 0; i <= F; ++i) {
      adds(ans[cnt + i], calc(i, (int)rt));
    }
  }
  ans.resize(m + 1);
  const int pw = mpow(2, n - basis.rank);
  for (int x : ans) {
    cout << mul(x, pw) << ' ';
  }
  cout << '\n';
}
