#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;   }