#include <bits/stdc++.h>
using namespace std;
int const p = 998244353;
int mod(int x) { return x >= p ? x - p : x; }
int n, c, a[3005];
namespace subtask1 {
int f[2][3005][1 << 12 | 1];
void main() {
  for (int i = 1; i <= n; i++) a[i]--;
  f[0][0][0] = f[1][0][0] = 1;
  for (int i = 1, v = 1; i <= n; i++, v ^= 1) {
    for (int j = 0; j * c <= i; j++)
      for (int k = 0; k < (1 << c); k++) f[v][j][k] = f[v ^ 1][j][k];
    for (int j = 0; j * c <= i; j++)
      for (int k = 0; k < (1 << c); k++)
        if (f[v ^ 1][j][k]) {
          int t = k | (1 << a[i]);
          if (t + 1 != (1 << c))
            f[v][j][t] = mod(f[v][j][t] + f[v ^ 1][j][k]);
          else
            f[v][j + 1][0] = mod(f[v][j + 1][0] + f[v ^ 1][j][k]);
        }
  }
  for (int i = 0; i * c <= n; i++) {
    int res = 0;
    for (int k = 0; k < (1 << c); k++) res = mod(res + f[n & 1][i][k]);
    if (!i) res = mod(res + p - 1);
    printf("%d ", res);
  }
  for (int i = 1; i <= n - n / c; i++) printf("0 ");
}
}  // namespace subtask1
namespace subtask2 {
int pw2[3005], f[3005][305], res[3005], cnt[3005], iv[3005];
int pw(int x, int y) {
  int res = 1;
  while (y) {
    if (y & 1) res = 1ll * res * x % p;
    x = 1ll * x * x % p;
    y >>= 1;
  }
  return res;
}
void main() {
  f[0][0] = pw2[0] = 1;
  for (int i = 1; i <= n; i++)
    pw2[i] = mod(pw2[i - 1] << 1), iv[i] = pw(mod(pw2[i] - 1 + p), p - 2);
  for (int i = 1; i <= n; i++) {
    memset(cnt, 0, sizeof(cnt));
    int lef = c - 1, s = 1;
    cnt[a[i]] = 1;
    for (int j = i - 1; j >= 0; j--) {
      if (!lef)
        for (int k = 0; k * c <= j; k++)
          f[i][k + 1] = (f[i][k + 1] + 1ll * f[j][k] * s) % p;
      if (cnt[a[j]]) {
        if (a[j] != a[i])
          s = 1ll * s * iv[cnt[a[j]]] % p, cnt[a[j]]++,
          s = 1ll * s * (pw2[cnt[a[j]]] - 1 + p) % p;
      } else
        lef--, cnt[a[j]]++;
    }
    memset(cnt, 0, sizeof(cnt));
    s = 1;
    for (int j = i + 1; j <= n; j++) cnt[a[j]]++;
    for (int j = 1; j <= c; j++) s = 1ll * s * (pw2[cnt[j]] - 1 + p) % p;
    s = mod(pw2[n - i] + p - s);
    if (i == n) s = 1;
    for (int j = 0; j * c <= i; j++) res[j] = (res[j] + 1ll * f[i][j] * s) % p;
  }
  memset(cnt, 0, sizeof(cnt));
  for (int i = 1; i <= n; i++) cnt[a[i]]++;
  for (int i = 1; i <= c; i++)
    f[0][0] = 1ll * f[0][0] * (pw2[cnt[i]] - 1 + p) % p;
  f[0][0] = mod(pw2[n] - f[0][0] + p - 1);
  res[0] = mod(res[0] + f[0][0]);
  for (int i = 0; i <= n / c; i++) printf("%d ", res[i]);
  for (int i = 1; i <= n - n / c; i++) printf("0 ");
}
}  // namespace subtask2
int main() {
  scanf("%d%d", &n, &c);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  if (c <= 12)
    subtask1::main();
  else
    subtask2::main();
  return 0;
}
