#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353;
const int uni = 1 << 20;
inline void upd(int &x, const int &y) { (x += y) >= mod ? x -= mod : 0; }
inline int add(int x, int y) { return x + y >= mod ? x + y - mod : x + y; }
inline int dec(int x, int y) { return x - y < 0 ? x - y + mod : x - y; }
int qpow(int a, int b) {
  int ans = 1;
  for (; b >= 1; b >>= 1, a = 1ll * a * a % mod)
    if (b & 1) ans = 1ll * ans * a % mod;
  return ans;
}
int n, m, s, pc[uni];
inline int popcount(long long x) {
  return pc[x & (uni - 1)] + pc[(x >> 20) & (uni - 1)] + pc[x >> 40];
}
struct Lbase {
  long long a[64];
  int size() {
    int s = 0;
    for (int i = 0; i <= m - 1; ++i) s += a[i] > 0;
    return s;
  }
  void insert(long long x) {
    for (int i = m - 1; i >= 0; --i)
      if (x >> i & 1) {
        if (!a[i]) {
          a[i] = x;
          for (int j = i - 1; j >= 0; --j)
            if (a[i] >> j & 1) a[i] ^= a[j];
          for (int j = i + 1; j <= m - 1; ++j)
            if (a[j] >> i & 1) a[j] ^= a[i];
          break;
        }
        x ^= a[i];
      }
  }
} L;
namespace task1 {
vector<int> pos;
int ans[64];
void dfs(int u, long long x) {
  if (u == s) {
    ans[popcount(x)]++;
    return;
  }
  dfs(u + 1, x ^ L.a[pos[u]]);
  dfs(u + 1, x);
}
void main() {
  for (int i = 0; i <= m - 1; ++i)
    if (L.a[i]) pos.push_back(i);
  dfs(0, 0);
  int tot = qpow(2, n - s);
  for (int i = 0; i <= m; ++i) {
    ans[i] = 1ll * ans[i] * tot % mod;
    printf("%d ", ans[i]);
  }
  putchar('\n');
}
}  // namespace task1
namespace task2 {
vector<int> pos;
long long sta, st[64];
int C[64][64], B[64][64], ans[64], cnt[64];
void dfs(int u, int c, long long free) {
  if (u == pos.size()) {
    cnt[popcount(free) + c]++;
    return;
  }
  dfs(u + 1, c + 1, free ^ st[pos[u]]);
  dfs(u + 1, c, free);
}
void main() {
  for (int i = 0; i <= m - 1; ++i)
    if (!L.a[i])
      pos.push_back(i);
    else
      sta ^= 1ll << i;
  for (int i = 0; i <= m - 1; ++i)
    if (L.a[i]) {
      for (int j = 0; j <= m - 1; ++j)
        if (!L.a[j] && L.a[i] >> j & 1) {
          st[j] ^= 1ll << i;
        }
    }
  dfs(0, 0, 0);
  for (int i = 0; i <= m; ++i) {
    C[i][0] = C[i][i] = 1;
    for (int j = 1; j <= i - 1; ++j) {
      C[i][j] = add(C[i - 1][j], C[i - 1][j - 1]);
    }
  }
  for (int k = 0; k <= m; ++k) {
    for (int i = 0; i <= m; ++i) {
      int res = 0;
      for (int j = 0; j <= m; ++j) {
        if (j > k || j > i) break;
        if (j & 1)
          res = dec(res, 1ll * C[i][j] * C[m - i][k - j] % mod);
        else
          upd(res, 1ll * C[i][j] * C[m - i][k - j] % mod);
      }
      upd(ans[k], 1ll * res * cnt[i] % mod);
    }
  }
  int tot = 1ll * qpow(2, n - s) * qpow((mod + 1) / 2, m - s) % mod;
  for (int i = 0; i <= m; ++i) {
    ans[i] = 1ll * ans[i] * tot % mod;
    printf("%d ", ans[i]);
  }
}
}  // namespace task2
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i) {
    long long x;
    scanf("%lld", &x);
    L.insert(x);
  }
  s = L.size();
  for (int i = 1; i <= uni - 1; ++i) pc[i] = pc[i & (i - 1)] + 1;
  long long Ag1 = 1ll << s, Ag2 = (1ll << (m - s)) + m * m;
  if (Ag1 < Ag2)
    task1::main();
  else
    task2::main();
  return 0;
}
