#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int mxn = 3001, cutoff = 11, mod = 998244353;
const bool DEBUG = 0;
ll half;
int n, c, k;
int a[mxn];
ll powe[mxn], invi[mxn], alge[mxn], conv[mxn];
ll ans[mxn], dp[mxn][mxn];
stringstream ss;
ll modpow(ll a, ll b) {
  a %= mod;
  return b ? (modpow(a * a % mod, b / 2) * (b & 1 ? a : 1LL)) % mod : 1LL;
}
ll inv(ll a) { return modpow(a, mod - 2); }
void quickadd(ll &a, ll b) {
  a += b;
  if (a >= mod) a -= mod;
}
void method2() {
  k = n / c;
  for (int i = 0; i < mxn; i++)
    for (int j = 0; j < mxn; j++) dp[i][j] = 0;
  int maxmask = (1 << c) - 1;
  dp[0][0] = 1;
  for (int i = 0; i < n; i++) {
    int shade = 1 << a[i];
    for (int p = k; p >= 0; p--)
      if (dp[p][0])
        for (int mask = maxmask - 1; mask >= 0; mask--)
          if (dp[p][mask]) {
            if ((mask | shade) < maxmask)
              quickadd(dp[p][mask | shade], dp[p][mask]);
            else
              quickadd(dp[p + 1][0], dp[p][mask]);
          }
  }
  for (int p = 0; p <= n; p++) {
    ans[p] = p ? 0 : mod - 1;
    if (p <= k)
      for (int mask = 0; mask < maxmask; mask++) quickadd(ans[p], dp[p][mask]);
  }
}
void method1() {
  k = n / c;
  for (int i = 0; i < mxn; i++) {
    powe[i] = i ? (powe[i - 1] + powe[i - 1]) % mod : 1;
    alge[i] = (powe[i] - 1 + mod) % mod;
    invi[i] = max(inv(alge[i]), 1LL);
    conv[i] = i ? alge[i] * invi[i - 1] % mod : 0;
    for (int j = 0; j < mxn; j++) dp[i][j] = 0;
  }
  dp[0][n] = 1;
  int mxy = 0;
  for (int j = n - 1; j >= 0; j--) {
    int cnt = c - 1;
    ll X = 1;
    int freq[c];
    for (int i = 0; i < c; i++) freq[i] = 0;
    freq[a[j]]++;
    for (int i = j - 1; i >= 0; i--) {
      if (!freq[a[i]]++) --cnt;
      X = X * conv[freq[a[i]]] % mod;
      if (!cnt) {
        ll ways = X * invi[freq[a[i]]] % mod;
        if (ways)
          for (int p = 0; p <= mxy; p++) {
            if (dp[p][j + 1]) {
              quickadd(dp[p + 1][i], ways * dp[p][j + 1] % mod);
              if (p >= mxy) mxy = min(k, p + 1);
            }
          }
      }
    }
    for (int p = k; p > 0; p--) quickadd(ans[p], dp[p][j] * powe[j] % mod);
  }
  ll X = 0;
  for (int p = k; p > 0; p--) {
    quickadd(ans[p], mod - X);
    quickadd(X, ans[p]);
  }
  ans[0] = (powe[n] - 1 - X + 2 * mod) % mod;
}
int main() {
  if (DEBUG) freopen("input.txt", "r", stdin);
  if (DEBUG) freopen("output.txt", "w", stdout);
  cin >> n >> c;
  k = n / c;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    a[i]--;
  }
  half = inv(2);
  for (int p = 0; p < mxn; p++) ans[p] = 0;
  if (c > cutoff)
    method1();
  else
    method2();
  for (int p = 0; p <= n; p++) ss << ans[p] << " ";
  cout << ss.str() << endl;
  return 0;
}
