#include <bits/stdc++.h>
using namespace std;
const int maxn = 3005;
const int INF = 998244353;
int n, c;
int a[maxn], ans[maxn];
inline int qpow(int x, int y) {
  int ret = 1;
  for (; y; y >>= 1) {
    if (y & 1) ret = 1ll * ret * x % INF;
    x = 1ll * x * x % INF;
  }
  return ret;
}
namespace Solve1 {
int cnt[maxn];
int f[maxn][maxn], w[maxn][maxn];
int pw2[maxn], invpw2[maxn];
inline void work() {
  pw2[0] = invpw2[0] = 1;
  for (int i = (1); i <= (n); ++i) {
    pw2[i] = (pw2[i - 1] << 1) % INF;
    invpw2[i] = qpow(pw2[i] - 1 + INF, INF - 2);
  }
  for (int i = (0); i < (n); ++i) {
    int nVis = c;
    for (int j = (0); j < (c); ++j) cnt[j] = 0;
    int res = 0;
    for (int j = (i); j < (n); ++j) {
      if (!cnt[a[j]]) --nVis;
      ++cnt[a[j]];
      if (!nVis) {
        res = max(res, 1);
        res = 1ll * res * invpw2[cnt[a[j]] - 1] % INF;
        w[i][j] = res;
        res = 1ll * res * (pw2[cnt[a[j]]] - 1 + INF) % INF;
      }
    }
  }
  f[0][0] = 1;
  for (int i = (0); i < (n); ++i)
    for (int j = (0); j <= (n); ++j)
      if (f[i][j]) {
        for (int k = (i); k < (n); ++k)
          if (w[i][k])
            (f[k + 1][j + 1] += 1ll * f[i][j] * w[i][k] % INF) %= INF;
      }
  for (int i = (0); i <= (n); ++i) {
    for (int j = (0); j <= (n); ++j)
      (ans[j] += 1ll * f[i][j] * pw2[n - i] % INF) %= INF;
  }
  for (int i = (0); i < (n); ++i) (ans[i] += INF - ans[i + 1]) %= INF;
  (ans[0] += INF - 1) %= INF;
  return;
}
}  // namespace Solve1
namespace Solve2 {
const int myMaxc = 10;
int f[2][maxn][1 << myMaxc];
inline void work() {
  int p = 0, q = 1;
  f[0][0][0] = 1;
  for (int i = (0); i < (n); ++i) {
    memset(f[q], 0, sizeof(f[q]));
    for (int j = (0); j < (n); ++j)
      for (int S = (0); S < (1 << c); ++S)
        if (f[p][j][S]) {
          (f[q][j][S] += f[p][j][S]) %= INF;
          int nS = S | (1 << a[i]);
          if (nS == (1 << c) - 1) {
            nS = 0;
            (f[q][j + 1][nS] += f[p][j][S]) %= INF;
          } else
            (f[q][j][nS] += f[p][j][S]) %= INF;
        }
    swap(p, q);
  }
  for (int j = (0); j <= (n); ++j)
    for (int S = (0); S < (1 << c); ++S) (ans[j] += f[p][j][S]) %= INF;
  (ans[0] += INF - 1) %= INF;
  return;
}
}  // namespace Solve2
int main() {
  scanf("%d%d", &n, &c);
  for (int i = (0); i < (n); ++i) scanf("%d", a + i), --a[i];
  if (c > 10)
    Solve1::work();
  else
    Solve2::work();
  for (int i = (0); i <= (n); ++i) printf("%d ", ans[i]);
  puts("");
  return 0;
}
