#include <bits/stdc++.h>
using namespace std;
const int mo = 998244353;
int n, m, s1, cnt[65536];
long long a[55], x, ans[55];
void insert(long long x) {
  for (int i = (int)(m - 1); i >= (int)(0); i--)
    if (x & (1ll << i))
      if (!a[i]) {
        a[i] = x;
        break;
      } else
        x ^= a[i];
}
int Count(long long x) {
  return cnt[x & 65535] + cnt[(x >> 16) & 65535] + cnt[(x >> 32) & 65535] +
         cnt[(x >> 48) & 65535];
}
void get_que(long long *q) {
  static long long q1[1 << 16];
  static long long q2[1 << 16];
  int m = (*q) / 2, l1 = m, l2 = (*q) - m;
  memset(q1, 0, sizeof(q1));
  memset(q2, 0, sizeof(q2));
  for (int i = (int)(0); i <= (int)((1 << l1) - 1); i++)
    for (int j = (int)(0); j <= (int)(l1 - 1); j++)
      if (i & (1 << j)) q1[i] ^= q[j + 1];
  for (int i = (int)(0); i <= (int)((1 << l2) - 1); i++)
    for (int j = (int)(0); j <= (int)(l2 - 1); j++)
      if (i & (1 << j)) q2[i] ^= q[j + 1 + l1];
  for (int i = (int)(0); i <= (int)((1 << l1) - 1); i++)
    for (int j = (int)(0); j <= (int)((1 << l2) - 1); j++)
      ++ans[Count(q1[i] ^ q2[j])];
}
void axiba1() {
  static long long q[55];
  for (int i = (int)(0); i <= (int)(m - 1); i++)
    if (a[i]) q[++*q] = a[i];
  get_que(q);
}
void axiba2() {
  static long long q[55], f[55];
  for (int i = (int)(m - 1); i >= (int)(0); i--)
    if (a[i])
      for (int j = (int)(i + 1); j <= (int)(m - 1); j++)
        if (a[j] & (1ll << i)) a[j] ^= a[i];
  for (int i = (int)(0); i <= (int)(m - 1); i++)
    if (!a[i]) {
      q[++*q] = 1ll << i;
      for (int j = (int)(0); j <= (int)(m - 1); j++)
        if (a[j] & (1ll << i)) q[*q] |= 1ll << j;
    }
  get_que(q);
  int top = *q;
  memcpy(q, ans, sizeof(q));
  memset(ans, 0, sizeof(ans));
  for (int i = (int)(0); i <= (int)(m); i++) {
    memset(f, 0, sizeof(f));
    f[0] = 1;
    for (int j = (int)(1); j <= (int)(m); j++)
      for (int k = (int)(m - 1); k >= (int)(0); k--)
        f[k + 1] += ((j <= i) ? -f[k] : f[k]);
    for (int j = (int)(0); j <= (int)(m); j++)
      ans[j] += (q[i] % mo) * (f[j] % mo);
  }
  for (int i = (int)(0); i <= (int)(m); i++) ans[i] = (ans[i] % mo + mo) % mo;
  for (int i = (int)(0); i <= (int)(m); i++)
    for (int j = (int)(1); j <= (int)(top); j++)
      ans[i] = 1ll * ans[i] * (mo + 1) / 2 % mo;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = (int)(0); i <= (int)((1 << 16) - 1); i++)
    cnt[i] = cnt[i / 2] + (i & 1);
  for (int i = (int)(1); i <= (int)(n); i++) scanf("%lld", &x), insert(x);
  for (int i = (int)(0); i <= (int)(m - 1); i++)
    if (a[i]) s1++;
  if (s1 <= 27)
    axiba1();
  else
    axiba2();
  int val = 1;
  for (int i = (int)(s1 + 1); i <= (int)(n); i++) val = 2ll * val % mo;
  for (int i = (int)(0); i <= (int)(m); i++)
    printf("%d ", 1ll * ans[i] % mo * val % mo);
}
