#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353;
int n, m;
vector<long long> bs;
int cnt[(1 << 16) + 1];
long long inv2 = (998244353 + 1) / 2;
int popcount(long long x) {
  return cnt[x & 65535] + cnt[x >> 16 & 65535] + cnt[x >> 32 & 65535] +
         cnt[x >> 48 & 65535];
}
bool add(long long x) {
  for (auto& t : bs) x = min(x, t ^ x);
  if (!x) return false;
  for (int i = 0; i < ((int)(bs).size() + 1); ++i)
    if (i == (int)(bs).size() || x > bs[i]) {
      bs.insert(bs.begin() + i, x);
      return true;
    }
}
void build() {
  for (int i = 0; i < (int)(bs).size(); i++) {
    for (int j = i + 1; j < (int)(bs).size(); j++)
      bs[i] = min(bs[i], bs[i] ^ bs[j]);
  }
  for (int i = 0; i < (int)(bs).size(); i++) {
    int l = m - 1 - i;
    if (!(bs[i] >> l & 1)) {
      int r = -1;
      for (int j = l - 1; j >= 0; j--) {
        if (bs[i] >> j & 1) {
          r = j;
          break;
        }
      }
      for (int j = 0; j < (int)(bs).size(); j++) {
        long long a = (bs[j] >> l & 1), b = (bs[j] >> r & 1);
        if (a != b) bs[j] ^= (1LL << l) | (1LL << r);
      }
    }
  }
  while ((int)(bs).size() < m)
    bs.push_back((1LL << (m - 1 - (int)(bs).size())));
  for (int i = 0; i < (int)(bs).size(); i++) {
    int l = m - 1 - i;
    for (int j = l + 1; j < (int)(bs).size(); j++) {
      bs[i] |= (bs[m - 1 - j] >> (m - 1 - i) & 1) << j;
    }
  }
}
long long cur = 0;
long long pk = 1;
long long res[55], fres[55];
long long C[55][55], f[55][55];
void dfs(int d) {
  if (d == (int)(bs).size()) {
    res[popcount(cur)]++;
    return;
  }
  dfs(d + 1);
  cur ^= bs[d];
  dfs(d + 1);
  cur ^= bs[d];
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  for (int i = 1; i < (1 << 16); i++) {
    cnt[i] = cnt[i / 2] + i % 2;
  }
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    long long x;
    cin >> x;
    if (!add(x)) pk *= 2, pk %= mod;
  }
  if ((int)(bs).size() <= 27) {
    dfs(0);
    for (int i = 0; i <= m; i++) cout << (pk * res[i] % mod + mod) % mod << " ";
    cout << "\n";
  } else {
    for (int i = 0; i < 55; i++) C[i][i] = C[i][0] = 1;
    for (int i = 0; i < 55; i++) {
      for (int j = 1; j < i; j++)
        C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
    }
    for (int b = 0; b <= m; b++) {
      for (int c = 0; c <= m; c++) {
        for (int a = 0; a <= b && a <= c; a++) {
          int s = (a % 2 == 0 ? 1 : -1);
          f[b][c] = (f[b][c] + s * C[b][a] * C[m - b][c - a]) % mod;
        }
      }
    }
    int k = (int)(bs).size();
    build();
    dfs(k);
    long long pmk = 1;
    for (int i = 0; i < m - k; i++) pk = (pk * inv2) % mod;
    for (int c = 0; c <= m; c++) {
      for (int b = 0; b <= m; b++) {
        fres[c] += (f[b][c] * res[b]);
        fres[c] %= mod;
      }
    }
    for (int i = 0; i <= m; i++)
      cout << (pk * fres[i] % mod + mod) % mod << " ";
    cout << "\n";
  }
}
