#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    x = x * 10 + c - '0';
    c = getchar();
  }
  return x * f;
}
const int mod = 998244353;
inline int mul(int x, int y) { return (long long)x * y % mod; }
inline void sub(int &x, int y) {
  y = x - y;
  x = y < 0 ? y + mod : y;
}
inline void add(int &x, int y) {
  y += x;
  x = y >= mod ? y - mod : y;
}
inline int inc(int x, int y) {
  x += y;
  return x >= mod ? x - mod : x;
}
inline int qpow(int x, int y) {
  int res = 1;
  for (; y; y >>= 1, x = mul(x, x))
    if (y & 1) res = mul(res, x);
  return res;
}
inline int inv(int x) { return x ? qpow(x, mod - 2) : 1; }
const int maxn = 3005;
const int maxm = 305;
int n, c, a[maxn];
namespace task1 {
int f[maxn][maxm], g[maxn][maxm], pw[maxn], sum[maxn], ipw[maxn];
void solve() {
  pw[0] = ipw[0] = 1;
  for (int i = 1; i <= n; i++) pw[i] = mul(pw[i - 1], 2);
  for (int i = 1; i <= n; i++) ipw[i] = inv(pw[i] - 1);
  int m = n / c;
  f[n + 1][0] = g[n + 1][0] = 1;
  for (int i = n; i >= 1; i--) {
    int cnt = 0, coef = 1;
    memset(sum, 0, sizeof sum);
    for (int j = i; j <= n; j++) {
      if (a[j] != a[i]) {
        if (!sum[a[j]])
          ++sum[a[j]], ++cnt;
        else
          coef = mul(coef, mul(ipw[sum[a[j]]], pw[sum[a[j]] + 1] - 1)),
          sum[a[j]]++;
      } else {
        if (!sum[a[j]])
          ++sum[a[j]], ++cnt;
        else
          coef = mul(coef, 2);
      }
      if (cnt == c && a[i] != a[j]) {
        int now_coef = mul(coef, ipw[sum[a[j]]]);
        for (int k = 1; k <= m; k++)
          if (g[j + 1][k - 1]) add(f[i][k], mul(now_coef, g[j + 1][k - 1]));
      }
    }
    int all = pw[n - i];
    for (int k = 1; k <= m; k++) g[i][k] = inc(g[i + 1][k], f[i][k]);
    for (int k = 1; k <= m; k++) sub(all, f[i][k]);
    f[i][0] = all, g[i][0] = inc(g[i + 1][0], all);
  }
  sub(g[1][0], 1);
  for (int i = 0; i <= m; i++) printf("%d ", g[1][i]);
  for (int i = m + 1; i <= n; i++) printf("0 ");
  putchar(10);
}
}  // namespace task1
namespace task2 {
int f[2][maxn][(1 << 10) + 10];
void solve() {
  f[0][0][0] = 1;
  int mx = (1 << c), m = n / c;
  for (int i = 0; i < n; i++) {
    int np = i & 1, p = np ^ 1;
    memset(f[p], 0, sizeof f[p]);
    for (int j = 0; j <= m; j++)
      for (int k = 0; k < mx; k++)
        if (f[np][j][k]) {
          int now = f[np][j][k];
          add(f[p][j][k], now);
          int t = k | (1 << (a[i + 1] - 1));
          if (t == mx - 1)
            add(f[p][j + 1][0], now);
          else
            add(f[p][j][t], now);
        }
  }
  for (int i = 0; i <= n; i++) {
    int s = 0;
    for (int j = 0; j < mx; j++) add(s, f[n & 1][i][j]);
    if (!i) sub(s, 1);
    printf("%d ", s);
  }
  putchar(10);
}
}  // namespace task2
int main() {
  n = read(), c = read();
  for (int i = 1; i <= n; i++) a[i] = read();
  if (c <= 10)
    task2::solve();
  else
    task1::solve();
  return 0;
}
