#include <bits/stdc++.h>
using namespace std;
const int mn = 1e5 + 10;
const int mm = 53;
const long long mod = 998244353;
long long basis[mm];
int m;
bool add(long long x) {
  for (int i = m - 1; i >= 0; i--)
    if ((x >> i) & 1) {
      if (basis[i])
        x ^= basis[i];
      else {
        basis[i] = x;
        return 1;
      }
    }
  return 0;
}
long long ans[mm + 1], num[mn + 1];
long long ch[mm + 10][mm + 10];
long long ve[mm + 10][mm + 10];
int rep[mm];
long long rehail(long long x) {
  long long ans = 0;
  for (int i = 0; i < m; i++) ans |= ((x >> i) & 1) << rep[i];
  return ans;
}
int main() {
  int n, k = 0;
  long long ex = 1;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    long long x;
    scanf("%lld", &x);
    if (add(x))
      k++;
    else
      ex = ex * 2 % mod;
  }
  vector<long long> bas;
  memset(rep, -1, sizeof(rep));
  int cur = 0;
  for (int i = m - 1; i >= 0; i--)
    if (basis[i]) {
      for (int j = i - 1; j >= 0; j--)
        if (basis[j] && ((basis[i] >> j) & 1)) basis[i] ^= basis[j];
    }
  for (int i = 0; i < m; i++)
    if (basis[i]) rep[i] = cur++, bas.push_back(basis[i]);
  for (int i = 0; i < m; i++)
    if (!basis[i]) rep[i] = cur++;
  for (long long& x : bas) x = rehail(x);
  if (k <= 27) {
    long long xs = 0;
    ans[0]++;
    for (int i = 1; i < 1 << k; i++) {
      for (int j = __builtin_ctz(i); j >= 0; j--) xs ^= bas[j];
      ans[__builtin_popcountll(xs)]++;
    }
    for (int i = 0; i <= m; i++) printf("%lld ", ans[i] * ex % mod);
  } else {
    vector<long long> rbas;
    for (int i = k; i < m; i++) {
      long long x = 0;
      for (int j = 0; j < k; j++) x |= ((long long)(bas[j] >> i) & 1) << j;
      x |= 1LL << i;
      rbas.push_back(x);
    }
    ch[0][0] = 1;
    for (int i = 1; i < m + 10; i++) {
      ch[i][0] = 1;
      for (int j = 1; j < m + 10; j++) {
        ch[i][j] = (ch[i - 1][j - 1] + ch[i - 1][j]) % mod;
      }
    }
    for (int i = 0; i <= m; i++) {
      for (int j = 0; j <= m; j++) {
        for (int l = 0; l <= min(i, j); l++) {
          if (l & 1) {
            ve[i][j] -= ch[j][l] * ch[m - j][i - l];
          } else {
            ve[i][j] += ch[j][l] * ch[m - j][i - l];
          }
          ve[i][j] %= mod;
        }
      }
    }
    num[0]++;
    long long xs = 0;
    for (int i = 1; i < 1 << m - k; i++) {
      for (int j = __builtin_ctz(i); j >= 0; j--) xs ^= rbas[j];
      num[__builtin_popcountll(xs)]++;
    }
    for (int i = 0; i <= m; i++) {
      for (int j = 0; j <= m; j++) {
        ans[i] += num[j] * ve[i][j], ans[i] %= mod;
      }
    }
    for (int i = 0; i < m - k; i++) ex *= (mod + 1) / 2, ex %= mod;
    for (int i = 0; i <= m; i++) {
      if (ans[i] < 0) ans[i] += mod;
      printf("%lld ", ans[i] * ex % mod);
    }
  }
}
