#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 7, M = 100, p = 998244353;
int n, m;
long long f[N], st[N], og[M], ans[M], fac[M], ifac[M];
struct liner {
  long long n, g[M];
} s1, op, of[M];
inline long long pows(long long u, int v) {
  long long ans = 1;
  while (v > 0) {
    if (v & 1) ans = ans * u % p;
    u = u * u % p, v = v >> 1;
  }
  return ans;
}
liner addit(liner u, long long v) {
  if (v == 0) return u;
  for (int i = m; i >= 0; i--) {
    if ((1ll << i) & v) {
      if (!u.g[i]) {
        u.g[i] = v, u.n++;
        return u;
      }
      v ^= u.g[i];
    }
  }
  return u;
}
liner merge(liner u, liner v) {
  long long res[M];
  liner t = op;
  for (int i = 0; i <= m; i++) res[i] = u.g[i];
  for (int i = m; i >= 0; i--) {
    if (v.g[i]) {
      long long cnt = 0;
      for (int j = i; j >= 0; j--) {
        if (v.g[i] & (1ll << j)) {
          if (u.g[j])
            v.g[i] ^= u.g[j], cnt ^= res[j];
          else {
            u.g[j] = v.g[i], res[j] = cnt;
            break;
          }
        }
      }
      if (v.g[i]) continue;
      t = addit(t, cnt);
    }
  }
  return t;
}
inline void dfs(int u, long long c) {
  if (u == st[0] + 1) {
    ans[__builtin_popcountll(c)]++;
    return;
  }
  dfs(u + 1, c ^ st[u]), dfs(u + 1, c);
}
inline long long binom(int a, int b) {
  if (a >= b) return fac[a] * ifac[b] % p * ifac[a - b] % p;
  return 0;
}
int main() {
  cin >> n >> m;
  long long opt = 1;
  fac[0] = ifac[0] = 1;
  for (int i = 1; i <= m; i++)
    fac[i] = fac[i - 1] * i % p, ifac[i] = pows(fac[i], p - 2);
  for (int i = 1; i <= n; i++) scanf("%lld", &f[i]), s1 = addit(s1, f[i]);
  n -= s1.n;
  while (n--) opt = opt * 2 % p;
  for (int i = 0; i <= m; i++)
    if (s1.g[i]) st[++st[0]] = s1.g[i];
  if (s1.n <= 28) {
    dfs(1, 0);
    for (int i = 0; i <= m; i++)
      ans[i] = ans[i] * opt % p, cout << ans[i] << " ";
  } else {
    for (int i = 1; i <= st[0]; i++) {
      int pos = 0;
      opt = opt * 2 % p;
      for (int x = 0; x < m; x++)
        if ((1ll << x) & st[i])
          pos = x;
        else
          of[i] = addit(of[i], (1ll << x));
      for (int x = 0; x < m; x++)
        if (((1ll << x) & st[i]) && pos != x)
          of[i] = addit(of[i], (1ll << x) | (1ll << pos));
    }
    for (int i = st[0]; i >= 2; i--) of[i - 1] = merge(of[i], of[i - 1]);
    st[0] = 0;
    for (int i = 0; i <= m; i++)
      if (of[1].g[i]) st[++st[0]] = of[1].g[i];
    dfs(1, 0), opt = opt * pows((p + 1) / 2, m) % p;
    for (int i = 0; i <= m; i++) {
      long long sum = 0;
      for (int j = 0; j <= m; j++)
        for (int k = 0; k <= min(i, j); k++) {
          if (k & 1)
            sum = (sum - binom(j, k) * binom(m - j, i - k) % p * ans[j]) % p;
          else
            sum = (sum + binom(j, k) * binom(m - j, i - k) % p * ans[j]) % p;
        }
      cout << (sum + p) % p * opt % p << " ";
    }
  }
  return 0;
}
