#include <bits/stdc++.h>
using namespace std;
const long long MOD = 998244353;
const long long MAXN = 3003;
long long p2[MAXN];
long long inv[MAXN];
long long sum(long long a, long long b) {
  return a + b >= MOD ? a + b - MOD : a + b;
}
long long sub(long long a, long long b) {
  return a - b < 0 ? a - b + MOD : a - b;
}
long long mul(long long a, long long b) { return (a * b) % MOD; }
long long power(long long a, long long b) {
  if (!b) return 1;
  long long r = power(a, b / 2);
  r = (r * r) % MOD;
  if (b % 2) r = (r * a) % MOD;
  return r;
}
const int PASS = 12;
int n, c;
int a[MAXN];
long long dp[MAXN][MAXN];
bool nonzero[MAXN][MAXN];
int target;
int p;
long long xp[MAXN][1 << PASS];
int where[MAXN][1 << PASS];
long long solve(int i, int msk) {
  if (msk == target) return dp[i][p - 1];
  if (i == 0) return 0;
  if (where[i][msk] == p) return xp[i][msk];
  where[i][msk] = p;
  return xp[i][msk] =
             sum(solve(i - 1, msk), solve(i - 1, msk | (1 << (a[i] - 1))));
}
int axeP(int i, int msk) { return where[i][msk] == p ? xp[i][msk] : 0; }
void buildxp() {
  int i;
  for (i = 0; i <= n; i++) {
    if (nonzero[p - 1][i]) {
      xp[i][target] = dp[p - 1][i];
      where[i][target] = p;
      break;
    }
  }
  for (i++; i <= n; i++) {
    xp[i][target] = dp[p - 1][i];
    where[i][target] = p;
    for (int msk = 1; msk < target; msk++) {
      xp[i][msk] = sum(axeP(i - 1, msk), axeP(i - 1, msk | (1 << (a[i] - 1))));
      where[i][msk] = p;
    }
  }
}
void chotoC() {
  target = (1 << c) - 1;
  for (p = 1; p * c <= n; p++) {
    buildxp();
    for (int i = 1; i <= n; i++) {
      dp[p][i] = axeP(i - 1, 1 << (a[i] - 1));
      dp[p][i] = sum(dp[p][i], dp[p][i - 1]);
      nonzero[p][i] = nonzero[p][i - 1];
      if (dp[p][i] > 0) nonzero[p][i] = true;
    }
  }
}
void boroC() {
  for (int i = 1; i <= n; i++) {
    vector<int> fr(c + 1, 0);
    int cnt = 0;
    long long gun = 1;
    for (int j = i; j > 0; j--) {
      fr[a[j]]++;
      if (fr[a[j]] == 1) {
        cnt++;
      } else {
        gun = mul(gun, inv[fr[a[j]] - 1]);
        gun = mul(gun, sub(p2[fr[a[j]]], 1));
      }
      if (a[j] != a[i] && cnt == c) {
        long long shit = mul(gun, inv[fr[a[j]]]);
        shit = mul(shit, inv[fr[a[i]]]);
        shit = mul(shit, p2[fr[a[i]] - 1]);
        xp[i][j] = shit;
      }
    }
  }
  for (int p = 1; p * c <= n && nonzero[p - 1][n]; p++) {
    for (int i = 1; i <= n; i++) {
      for (int j = i; j > 0 && nonzero[p - 1][j - 1]; j--) {
        dp[p][i] = sum(dp[p][i], mul(xp[i][j], dp[p - 1][j - 1]));
      }
      dp[p][i] = sum(dp[p][i], dp[p][i - 1]);
      nonzero[p][i] = nonzero[p][i - 1];
      if (dp[p][i] > 0) nonzero[p][i] = true;
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  p2[0] = 1;
  for (int i = 1; i < MAXN; i++) {
    p2[i] = mul(p2[i - 1], 2);
    inv[i] = power(sub(p2[i], 1), MOD - 2);
  }
  cin >> n >> c;
  for (int i = 1; i <= n; i++) cin >> a[i];
  {
    vector<long long> fr(c + 1, 0);
    dp[0][0] = 1;
    nonzero[0][0] = true;
    for (long long i = 1; i <= n; i++) {
      fr[a[i]]++;
      dp[0][i] = p2[i - 1];
      long long ml = 1;
      for (long long j = 1; j <= c; j++) {
        if (j == a[i])
          ml = mul(ml, p2[fr[j] - 1]);
        else
          ml = mul(ml, sub(p2[fr[j]], 1));
      }
      dp[0][i] = sub(dp[0][i], ml);
      dp[0][i] = sum(dp[0][i], dp[0][i - 1]);
      nonzero[0][i] = true;
    }
  }
  if (c < PASS)
    chotoC();
  else
    boroC();
  cout << sub(dp[0][n], 1);
  for (p = 1; p <= n; p++) cout << " " << dp[p][n];
  cout << "\n";
  return 0;
}
