#include <bits/stdc++.h>
using namespace std;
inline char gc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
inline long long read() {
  long long x = 0;
  char ch = getchar();
  bool positive = 1;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') positive = 0;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  return positive ? x : -x;
}
inline void write(long long a) {
  if (a < 0) {
    a = -a;
    putchar('-');
  }
  if (a >= 10) write(a / 10);
  putchar('0' + a % 10);
}
inline void writeln(long long a) {
  write(a);
  puts("");
}
inline void wri(long long a) {
  write(a);
  putchar(' ');
}
inline unsigned long long rnd() {
  return ((unsigned long long)rand() << 30 ^ rand()) << 4 | rand() % 4;
}
const int N = 3005, B = 11, mod = 998244353;
const long long mod2 = (long long)mod * mod * 7;
int a[N];
bool vis[N];
inline void add(int &a, int b) { a = a + b >= mod ? a + b - mod : a + b; }
int main() {
  int n = read(), c = read();
  for (int i = (int)(1); i <= (int)(n); i++) a[i] = read();
  if (c > B) {
    static long long dp[N][N / B + 2];
    dp[0][0] = 1;
    for (int i = (int)(c); i <= (int)(n); i++) {
      memset(vis, 0, sizeof(vis));
      int m = i / c;
      for (int j = (int)(i - 1); j >= (int)(1); j--) {
        vis[a[j]]++;
        long long xs = 1;
        for (int k = (int)(1); k <= (int)(c); k++)
          if (a[i] != k) xs = xs * vis[k] % mod;
        for (int k = (int)(1); k <= (int)(m); k++) {
          dp[i][k] += dp[j - 1][k - 1] * xs;
          if (dp[i][k] >= mod2) dp[i][k] -= mod2;
        }
      }
      for (int j = (int)(1); j <= (int)(m); j++) dp[i][j] %= mod;
    }
    int m = n / c;
    for (int i = (int)(0); i <= (int)(n); i++)
      if (i > m)
        wri(0);
      else {
        int ans = 0;
        for (int j = (int)(1); j <= (int)(n); j++) ans = (ans + dp[j][i]) % mod;
        wri(ans);
      }
  } else {
    static int dp[2][N / B + 2][1 << B | 2];
    for (int i = (int)(0); i <= (int)(n - 1); i++) a[i] = a[i + 1] - 1;
    dp[0][0][0] = 1;
    for (int i = (int)(0); i <= (int)(n - 1); i++) {
      int m = i / c;
      for (int j = (int)(0); j <= (int)(m); j++) {
        add(dp[i & 1][j + 1][0], dp[i & 1][j][(1 << c) - 1]);
        dp[i & 1][j][(1 << c) - 1] = 0;
        for (int k = (int)(0); k <= (int)((1 << c) - 2); k++) {
          add(dp[i & 1 ^ 1][j][k | (1 << a[i])], dp[i & 1][j][k]);
          add(dp[i & 1 ^ 1][j][k], dp[i & 1][j][k]);
          dp[i & 1][j][k] = 0;
        }
      }
    }
    int m = n / c;
    for (int i = (int)(0); i <= (int)(n); i++)
      if (i <= m) {
        add(dp[n & 1][i + 1][0], dp[n & 1][i][(1 << c) - 1]);
        int ans = i ? 0 : mod - 1;
        for (int j = (int)(0); j <= (int)((1 << c) - 2); j++)
          add(ans, dp[n & 1][i][j]);
        wri(ans);
      } else
        wri(0);
  }
}
