結果
問題 |
No.3004 ヤング図形
|
ユーザー |
![]() |
提出日時 | 2025-01-18 16:59:11 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,769 bytes |
コンパイル時間 | 3,655 ms |
コンパイル使用メモリ | 290,212 KB |
実行使用メモリ | 374,528 KB |
最終ジャッジ日時 | 2025-01-18 17:00:17 |
合計ジャッジ時間 | 62,863 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 17 TLE * 8 |
ソースコード
#include <bits/stdc++.h> #include <atcoder/modint> using namespace std; #define For(i, a, b) for(int i = (a); i < (b); i++) #define rep(i, n) For(i, 0, n) #define rFor(i, a, b) for(int i = (a); i >= (b); i--) #define ALL(v) (v).begin(), (v).end() #define rALL(v) (v).rbegin(), (v).rend() using lint = long long; using ld = long double; int INF = 2000000000; lint LINF = 1000000000000000000; using mint = atcoder::modint998244353; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int k; cin >> k; vector<int> l(k), m(k); int n = 0; rep(i, k) { cin >> l[i] >> m[i]; n += l[i] * m[i]; } set<int> num; int sum = n; rep(i, k) { num.insert(sum); num.insert(l[i] * m[i]); num.insert(sum - l[i] * m[i]); sum -= l[i] * m[i]; } rep(i, k) { int rest = l[i] * m[i]; rep(_, m[i]) { num.insert(rest); num.insert(l[i]); num.insert(rest - l[i]); rest -= l[i]; } num.insert(m[i]); } map<int, mint> Fac, Finv; Fac[0] = Fac[1] = 1; Finv[0] = Finv[1] = 1; mint now = 1; for (int i = 2; i <= n; i++) { now *= mint(i); if (num.count(i)) { Fac[i] = now; Finv[i] = now.inv(); } } auto comb = [&](int n, int k) -> mint { return Fac[n] * Finv[k] * Finv[n - k]; }; mint ans = 1; sum = n; rep(i, k) { ans *= comb(sum, l[i] * m[i]); sum -= l[i] * m[i]; } rep(i, k) { int rest = l[i] * m[i]; rep(_, m[i]) { ans *= comb(rest, l[i]); rest -= l[i]; } ans /= Fac[m[i]]; } cout << ans.val() << "\n"; }