func_code_string: #include <bits/stdc++.h>   using namespace std;   const int mod = 998244353;   const int N = 3005;   int n, c, a[N], dp[N][N], g[N][N], freq[N], mul[N], imul[N], pw[N], cnt[N];   int dp2[2][N][1 << 12];   int inverse(int n) {     if (n == 1) return 1;     return inverse(mod % n) * 1LL * (mod - mod / n) % mod;   }   inline void add(int &x, int y) {     x += y;     if (x >= mod) x -= mod;   }   void solve1() {     for (int i = 1; i <= n; i++) {       a[i]--;     }     memset(dp2, 0, sizeof(dp2));     int flg = 0;     dp2[0][0][0] = 1;     for (int i = 1; i <= n; i++) {       for (int p = 0; p * c <= i; p++) {         for (int mask = 0; mask < (1 << c); mask++) {           dp2[flg ^ 1][p][mask] = 0;         }       }       for (int p = 0; p * c <= i; p++) {         for (int mask = 0; mask + 1 < (1 << c); mask++) {           int nmask = mask | (1 << a[i]);           if (nmask + 1 == (1 << c)) {             add(dp2[flg ^ 1][p + 1][0], dp2[flg][p][mask]);           } else {             add(dp2[flg ^ 1][p][nmask], dp2[flg][p][mask]);           }           add(dp2[flg ^ 1][p][mask], dp2[flg][p][mask]);         }       }       flg ^= 1;     }     memset(cnt, 0, sizeof(cnt));     for (int p = 0; p <= n; p++) {       for (int mask = 0; mask + 1 < (1 << c); mask++) {         add(cnt[p], dp2[flg][p][mask]);       }     }     add(cnt[0], mod - 1);     for (int i = 0; i <= n; i++) {       cout << cnt[i] <<    ;     }     cout <<   n ;   }   void solve2() {     mul[0] = 0;     pw[0] = 1;     for (int i = 1; i <= n; i++) {       mul[i] = mul[i - 1] + mul[i - 1] + 1;       if (mul[i] >= mod) mul[i] -= mod;       imul[i] = inverse(mul[i]);       pw[i] = mul[i] + 1;     }     memset(g, 0, sizeof(g));     for (int i = 1; i <= n; i++) {       int cnt = 0;       long long prd = 1;       memset(freq, 0, sizeof(freq));       for (int j = i; j <= n; j++) {         if (freq[a[j]] == 0) {           cnt++;         } else {           (prd *= imul[freq[a[j]]]) %= mod;         }         freq[a[j]]++;         (prd *= mul[freq[a[j]]]) %= mod;         if (cnt == c) {           g[i][j] = prd * imul[freq[a[j]]] % mod;         }       }     }     memset(dp, 0, sizeof(dp));     for (int i = 1; i <= n; i++) {       dp[i][1] = g[1][i];       for (int j = 1; j <= i; j++) {         for (int p = 2; p * c <= i; p++) {           dp[i][p] += dp[j - 1][p - 1] * 1LL * g[j][i] % mod;           if (dp[i][p] >= mod) dp[i][p] -= mod;         }       }     }     memset(cnt, 0, sizeof(cnt));     for (int i = 1; i <= n; i++) {       for (int p = 1; p * c <= i; p++) {         cnt[p] += dp[i][p] * 1LL * pw[n - i] % mod;         if (cnt[p] >= mod) cnt[p] -= mod;       }     }     cnt[0] = mul[n] + mod - cnt[1];     if (cnt[0] >= mod) cnt[0] -= mod;     for (int p = 1; p <= n; p++) {       cnt[p] += mod - cnt[p + 1];       if (cnt[p] >= mod) cnt[p] -= mod;     }     for (int i = 0; i <= n; i++) {       cout << cnt[i] <<    ;     }     cout <<   n ;   }   int main() {     ios::sync_with_stdio(false);     cin.tie(0);     cin >> n >> c;     for (int i = 1; i <= n; i++) {       cin >> a[i];     }     if (c <= 10) {       solve1();     } else {       solve2();     }     return 0;   }   