#include <bits/stdc++.h>
using namespace std;
int dp1[2][3005][3005], dp[3005][3005], n, m, c, ans[3005], a[3005], vis[3005],
    f[3005][3005], mi[3005], sm[3005], now, sum[3005][3005];
vector<int> vec[3005];
int add(int x) { return x >= 998244353 ? x - 998244353 : x; }
int jian(int x) { return x < 0 ? x + 998244353 : x; }
void solve1() {
  dp1[now][0][0] = 1;
  for (int i = 0; i < n; i++) {
    now ^= 1;
    memset(dp1[now], 0, sizeof(dp1[now]));
    for (int t = 0; t <= i / c; t++) {
      for (int j = 0; j < 1 << c; j++) {
        if (!dp1[now ^ 1][t][j]) continue;
        int v = dp1[now ^ 1][t][j];
        dp1[now][t][j] = add(dp1[now][t][j] + v);
        if ((j | (1 << a[i + 1] - 1)) == (1 << c) - 1) {
          dp1[now][t + 1][0] = add(dp1[now][t + 1][0] + v);
        } else {
          dp1[now][t][j | (1 << a[i + 1] - 1)] =
              add(dp1[now][t][j | (1 << a[i + 1] - 1)] + v);
        }
      }
    }
  }
  ans[0] = 998244353 - 1;
  for (int t = 0; t <= n; t++) {
    for (int j = 0; j < 1 << c; j++) {
      ans[t] = add(ans[t] + dp1[now][t][j]);
    }
    printf("%d ", ans[t]);
  }
}
void solve2() {
  for (int i = 1; i <= n; i++) {
    memset(vis, 0, sizeof(vis));
    vis[0] = 0;
    for (int t = i; t <= n; t++) {
      if (!vis[a[t]]) vis[0]++;
      vis[a[t]]++;
      if (vis[0] == c) {
        f[i][t] = 1;
        for (int j = 1; j <= c; j++) {
          if (j == a[i]) {
            f[i][t] = 1ll * f[i][t] * mi[vis[j] - 1] % 998244353;
          } else if (j != a[t]) {
            f[i][t] = 1ll * f[i][t] * (mi[vis[j]] - 1) % 998244353;
          }
        }
        vec[t].push_back(i);
        break;
      }
    }
  }
  for (int i = n; i >= 1; i--) {
    sm[i] = sm[i + 1];
    for (int t = i; t <= n; t++) {
      sm[i] = add(sm[i] + f[i][t]);
    }
  }
  for (int i = 1; i <= n; i++) {
    sm[i] = jian(mi[n - i + 1] - sm[i]);
  }
  sm[n + 1] = 1;
  dp[0][0] = 1;
  sum[0][0] = 1;
  for (int i = 1; i <= n; i++) {
    for (int t = 1; t <= m; t++) {
      for (int j = 0; j < vec[i].size(); j++) {
        int las = vec[i][j];
        dp[i][t] =
            (1ll * sum[las - 1][t - 1] * f[las][i] + dp[i][t]) % 998244353;
      }
      sum[i][t] = add(sum[i - 1][t] + dp[i][t]);
    }
  }
  ans[0] = 998244353 - 1;
  for (int i = 0; i <= n; i++) {
    for (int t = 0; t <= m; t++) {
      ans[t] = (1ll * dp[i][t] * sm[i + 1] + ans[t]) % 998244353;
    }
  }
  for (int i = 0; i <= n; i++) {
    printf("%d ", ans[i]);
  }
}
int main() {
  scanf("%d%d", &n, &c);
  m = n / c;
  mi[0] = 1;
  for (int i = 1; i <= n; i++) mi[i] = mi[i - 1] * 2 % 998244353;
  int k = log2(n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  if (c <= k) {
    solve1();
  } else {
    solve2();
  }
}
