結果
問題 |
No.1621 Sequence Inversions
|
ユーザー |
![]() |
提出日時 | 2021-07-12 22:57:10 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 134 ms / 3,000 ms |
コード長 | 1,425 bytes |
コンパイル時間 | 1,370 ms |
コンパイル使用メモリ | 85,096 KB |
最終ジャッジ日時 | 2025-01-23 00:51:02 |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
#include <algorithm> #include <iostream> #include <vector> #include <atcoder/modint> 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<int> a(t); for (int i = 0; i < t; i++){ cin >> a[i]; } sort(a.begin(), a.end()); vector<int> 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<mint>(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; }