#include #include #include #include using namespace std; using mint = atcoder::modint998244353; mint f[101][101][2501]; int main(){ for (int i = 0; i < 101; i++){ f[0][i][0] = 1; } for (int n = 1; n < 101; n++){ for (int k = 0; k < 101; k++){ for (int m = 0; m < 2501; m++){ if (n * k < m){ break; } f[n][k][m] += f[n - 1][k][m]; if (m - n >= 0 && k > 0){ f[n][k][m] += f[n][k - 1][m - n]; } } } } int t, k; cin >> t >> k; vector a(t); for (int i = 0; i < t; i++){ cin >> a[i]; } sort(a.begin(), a.end()); vector cnt(100); int n = 0; for (int i = 0; i < t - 1; i++){ cnt[n]++; if (a[i] != a[i + 1]){ n++; } } cnt[n++]++; vector dp(n + 1, vector(5000, 0)); dp[0][0] = 1; int cursum = 0; for (int i = 1; i <= n; i++){ auto x = cnt[i - 1]; for (int j = 0; j < 5000; j++){ for (int l = 0; l <= cursum * x; l++){ if (j - l < 0){ break; } dp[i][j] += f[x][cursum][l] * dp[i - 1][j - l]; } } cursum += x; } cout << dp[n][k].val() << endl; }