#include <bits/stdc++.h>
long long n, m, a[1100005], cntA, A[1100005], C[105][105], G[105][105],
    ans[105], S[1100005], E[1100005], cnt[1100005];
long long read() {
  char c = getchar();
  long long ans = 0;
  while (c < '0' || c > '9') c = getchar();
  while (c >= '0' && c <= '9') ans = ans * 10 + c - '0', c = getchar();
  return ans;
}
void Write(long long x) {
  if (x < 10)
    putchar(x ^ 48);
  else
    Write(x / 10), putchar((x % 10) ^ 48);
  return;
}
long long add(long long x, long long y) {
  return (x += y) >= 998244353 ? x - 998244353 : x;
}
long long power(long long x, long long y) {
  long long ans = 1, now = x;
  if (y < 0) y += 998244353 - 1;
  for (register long long i = y; i; i >>= 1, now = now * now % 998244353)
    if (i & 1) ans = ans * now % 998244353;
  return ans;
}
void Insert(long long x) {
  for (register long long i = m - 1; i >= 0; i--) {
    if (!(x >> i & 1)) continue;
    if (!A[i]) {
      A[i] = x, ++cntA;
      for (register long long j = 0; j < i; j++)
        if (A[i] >> j & 1) A[i] ^= A[j];
      for (register long long j = i + 1; j < m; j++)
        if (A[j] >> i & 1) A[j] ^= A[i];
      break;
    } else
      x ^= A[i];
  }
  return;
}
void DFS(int x, long long now) {
  if (x > *S)
    ++ans[cnt[now & 1048575] + cnt[now >> 20 & 1048575] + cnt[now >> 40]];
  else
    DFS(x + 1, now), DFS(x + 1, now ^ S[x]);
  return;
}
int main() {
  n = read(), m = read();
  for (register long long i = 1; i <= n; i++) Insert(a[i] = read());
  for (register int i = 0; i < (1 << 20); i++) cnt[i] = cnt[i >> 1] + (i & 1);
  for (register long long i = 0; i < 100; i++) {
    C[i][0] = C[i][i] = 1;
    for (register long long j = 1; j < 100; j++)
      C[i][j] = add(C[i - 1][j], C[i - 1][j - 1]);
  }
  if (cntA <= m / 2) {
    long long mul = power(2, n - cntA);
    for (register long long i = 0; i < m; i++)
      if (A[i]) S[++*S] = A[i];
    DFS(1, 0);
    for (register long long i = 0; i <= m; i++)
      Write(ans[i] * mul % 998244353), putchar(' ');
    return 0;
  }
  for (register long long i = 0; i < m; i++) {
    if (A[i]) continue;
    long long now = 1ll << i;
    for (register int j = i + 1; j < m; j++)
      if (A[j] >> i & 1) now |= (1ll << j);
    S[++*S] = now;
  }
  DFS(1, 0);
  for (register long long i = 0; i <= m; i++)
    for (register long long j = 0; j <= m; j++)
      for (register long long k = 0; k <= j && k <= i; k++)
        G[i][j] = (G[i][j] + C[j][k] * C[m - j][i - k] % 998244353 *
                                 ((k & 1) ? 998244353 - 1 : 1)) %
                  998244353;
  for (register long long i = 0; i <= m; i++, putchar(' ')) {
    long long Ans = 0;
    for (register long long j = 0; j <= m; j++)
      Ans = (Ans + ans[j] * G[i][j]) % 998244353;
    Write(Ans * power(2, n - m) % 998244353);
  }
  return 0;
}
