#include <bits/stdc++.h>
using namespace std;
int g[3005][3005], f[3005][3005], s[3005][3005], dp[2][3005][1024];
int n, c, a[3005], buc[3005], pw[3005], iv[3005];
int Pow(int n, int x = 998244353 - 2, int r = 1) {
  for (; x; n = 1ll * n * n % 998244353, x >>= 1)
    if (x & 1) r = 1ll * r * n % 998244353;
  return r;
}
int main() {
  scanf("%d%d", &n, &c);
  if (c == 1) {
    f[0][0] = 1;
    for (int i = 1; i <= n; i++)
      for (int j = f[i][0] = 1; j <= i; j++)
        f[i][j] = f[i - 1][j] + f[i - 1][j - 1],
        f[i][j] -= (f[i][j] >= 998244353) ? 998244353 : 0;
    putchar('0');
    for (int i = 1; i <= n; i++) printf(" %d", f[n][i]);
    return 0;
  }
  if (c <= 10) {
    dp[0][0][0] = 1;
    for (int i = 1, x; i <= n; i++) {
      scanf("%d", &x);
      for (int j = 0; j <= i && j <= n / c; j++)
        for (int k = 0; k < (1 << c); k++) dp[i & 1][j][k] = 0;
      for (int j = 0; j <= i && j <= n / c; j++)
        for (int k = 0; k < (1 << c); k++)
          if (dp[(i & 1) ^ 1][j][k]) {
            dp[i & 1][j][k] += dp[(i & 1) ^ 1][j][k],
                dp[i & 1][j][k] -=
                (dp[i & 1][j][k] >= 998244353) ? 998244353 : 0;
            if ((k | (1 << x - 1)) == (1 << c) - 1)
              dp[i & 1][j + 1][0] += dp[(i & 1) ^ 1][j][k],
                  dp[i & 1][j + 1][0] -=
                  (dp[i & 1][j + 1][0] >= 998244353) ? 998244353 : 0;
            else
              dp[i & 1][j][k | (1 << x - 1)] += dp[(i & 1) ^ 1][j][k],
                  dp[i & 1][j][k | (1 << x - 1)] -=
                  (dp[i & 1][j][k | (1 << x - 1)] >= 998244353) ? 998244353 : 0;
          }
    }
    for (int i = 0; i <= n; i++) {
      int res = 0;
      if (i == 0) res = 998244353 - 1;
      for (int j = 0; j < (1 << c); j++)
        res += dp[n & 1][i][j], res -= (res >= 998244353) ? 998244353 : 0;
      printf("%d ", res);
    }
    return 0;
  }
  pw[0] = 0, iv[0] = 1;
  for (int i = 1; i <= n; i++)
    pw[i] = pw[i - 1] + pw[i - 1] + 1,
    pw[i] -= (pw[i] >= 998244353) ? 998244353 : 0, iv[i] = Pow(pw[i]),
    scanf("%d", &a[i]);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= c; j++) buc[j] = 0;
    int res = 1, rst = c - 1;
    for (int j = i + 1; j <= n; j++)
      if (a[i] ^ a[j]) {
        if (buc[a[j]])
          res = 1ll * res * iv[buc[a[j]]] % 998244353;
        else
          rst--;
        if (!rst) g[i][j] = res;
        res = 1ll * res * pw[++buc[a[j]]] % 998244353;
      } else
        res <<= 1, res -= (res >= 998244353) ? 998244353 : 0;
  }
  s[n + 1][0] = 1;
  for (int i = n; i; i--) {
    for (int j = 1; j <= n; j++) {
      int &res = f[i][j];
      for (int k = i + c - 1; k <= n && s[k + 1][j - 1]; k++)
        res = (res + 1ll * g[i][k] * s[k + 1][j - 1]) % 998244353;
      if (!res) break;
    }
    f[i][0] = pw[n - i] + 1;
    for (int j = 0; j <= n; j++)
      s[i][j] = s[i + 1][j] + f[i][j],
      s[i][j] -= (s[i][j] >= 998244353) ? 998244353 : 0;
  }
  s[1][0]--;
  for (int i = 0; i <= n; i++)
    printf("%d ", (s[1][i] + 998244353 - s[1][i + 1]) % 998244353);
}
