#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
using namespace std;
const int N = 3000 + 10;
const int MOD = 998244353;
const int LOG = 20;
const int INF = 1000000010;
const int delta = 11353;
int n, c, a[N], ans[N], inv[N], P2[N], inv1[N], P21[N], Mul, Mul1, cnt[N];
inline void add(int &a, int b) {
  a += b;
  if (a >= MOD) a -= MOD;
}
inline int minu(int a, int b) {
  a -= b;
  if (a < 0) a += MOD;
  return a;
}
inline int POW(int a, int b) {
  int res = 1;
  while (b) {
    if (b & 1) res = res * 1ll * a % MOD;
    b >>= 1;
    a = a * 1ll * a % MOD;
  }
  return res;
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> c;
  P2[0] = 1;
  for (int i = 1; i < N; i++) P2[i] = P2[i - 1] * 2ll % MOD, P21[i] = P2[i] - 1;
  inv[N - 1] = POW(P2[N - 1], MOD - 2);
  inv1[N - 1] = POW(P21[N - 1], MOD - 2);
  for (int i = N - 2; i >= 0; i--)
    inv[i] = inv[i + 1] * 2ll % MOD, inv1[i] = POW(P21[i], MOD - 2);
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    a[i]--;
  }
  if (c <= 12) {
    int DP[2][n / c + 2][(1 << c) + 2];
    memset(DP, 0, sizeof DP);
    DP[0][0][0] = 1;
    bool f = 0;
    for (int i = 0; i < n; i++) {
      memset(DP[f ^ 1], 0, sizeof DP[f ^ 1]);
      for (int j = 0; j <= i / c; j++)
        for (int mask = 0; mask < (1 << c); mask++) {
          add(DP[f ^ 1][j][mask], DP[f][j][mask]);
          int mask2 = (mask | (1 << a[i + 1]));
          if (mask2 == ((1 << c) - 1)) {
            add(DP[f ^ 1][j + 1][0], DP[f][j][mask]);
          } else
            add(DP[f ^ 1][j][mask2], DP[f][j][mask]);
        }
      f ^= 1;
    }
    DP[f][0][0]--;
    if (DP[f][0][0] < 0) DP[f][0][0] += MOD;
    for (int i = 0; i <= n / c; i++)
      for (int mask = 0; mask < (1 << c); mask++) add(ans[i], DP[f][i][mask]);
  } else {
    int DP[n + 2][n / c + 2];
    memset(DP, 0, sizeof DP);
    DP[0][0] = 1;
    Mul = 1, Mul1 = 1;
    for (int i = 1; i <= n; i++) {
      Mul = 1, Mul1 = 1;
      memset(cnt, 0, sizeof cnt);
      for (int j = 1; j <= n; j++) cnt[a[j]]++;
      for (int j = 0; j < c; j++)
        Mul = Mul * 1ll * P2[cnt[j]] % MOD,
        Mul1 = Mul1 * 1ll * P21[cnt[j]] % MOD;
      DP[i][0] = minu(Mul, Mul1);
      memset(cnt, 0, sizeof cnt);
      int ted = 0;
      Mul = 1;
      for (int j = i; j >= 1; j--) {
        if (cnt[a[j]] != 0) {
          Mul = Mul * 1ll * inv1[cnt[a[j]]] % MOD, cnt[a[j]]++,
          Mul = Mul * 1ll * P21[cnt[a[j]]] % MOD;
        } else
          ted++, cnt[a[j]]++;
        if (ted == c) {
          if (j != 1)
            for (int k = 2; k <= i / c; k++) {
              add(DP[i][k], DP[j - 1][k - 1] * 1ll *
                                (Mul * 1ll * inv1[cnt[a[i]]] % MOD) % MOD);
            }
          else
            for (int k = 1; k <= i / c; k++)
              add(DP[i][k], DP[j - 1][k - 1] * 1ll *
                                (Mul * 1ll * inv1[cnt[a[i]]] % MOD) % MOD);
        }
      }
    }
    for (int i = 1; i <= n; i++) {
      memset(cnt, 0, sizeof cnt);
      Mul = 1, Mul1 = 1;
      for (int j = i + 1; j <= n; j++) {
        cnt[a[j]]++;
      }
      for (int j = 0; j < c; j++)
        Mul = Mul * 1ll * P2[cnt[j]] % MOD,
        Mul1 = Mul1 * 1ll * P21[cnt[j]] % MOD;
      for (int j = 1; j <= n / c; j++) {
        add(ans[j], DP[i][j] * 1ll * minu(Mul, Mul1) % MOD);
      }
      ans[0] = DP[n][0] - 1;
    }
  }
  for (int i = 0; i <= n; i++) cout << ans[i] << ' ';
  return 0;
}
