#include #include #include #include using namespace std; #define FOR(i, begin, end) for(int i=(begin),i##_end_=(end);i #include using mint = atcoder::modint998244353; int main() { cin.tie(nullptr), ios::sync_with_stdio(false); int N, K; cin >> N >> K; vector A(N); for (auto &a : A) cin >> a; map mp; for (auto a : A) mp[a]++; int n = 0; auto compare = [&](const vector &l, const vector &r) { return l.size() > r.size(); }; priority_queue, vector>, decltype(compare)> pq{compare}; pq.emplace(vector{1}); for (auto [k, cnt] : mp) { vector dp(cnt + 1, vector(K + 1)); dp[0][0] = 1; REP(t, n + 1) { REP(iuse, dp.size() - 1) REP(k, int(dp[iuse].size()) - t) if (dp[iuse][k].val()) { dp[iuse + 1][k + t] += dp[iuse][k]; } } auto v = dp.back(); while (v.size() and v.back() == 0) v.pop_back(); pq.emplace(v); n += cnt; } while (pq.size() > 1) { auto f1 = pq.top(); pq.pop(); auto f2 = pq.top(); pq.pop(); auto f = atcoder::convolution(f1, f2); if (f.size() > K) f.resize(K + 1); pq.emplace(f); } auto f = pq.top(); cout << (int(f.size()) > K ? f[K] : 0).val() << '\n'; }