結果
問題 |
No.1709 Indistinguishable by MEX
|
ユーザー |
![]() |
提出日時 | 2025-08-15 15:45:40 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 24 ms / 2,000 ms |
コード長 | 2,789 bytes |
コンパイル時間 | 3,053 ms |
コンパイル使用メモリ | 281,708 KB |
実行使用メモリ | 7,716 KB |
最終ジャッジ日時 | 2025-08-15 15:45:46 |
合計ジャッジ時間 | 5,961 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; bool chmin(auto &a, auto b) { return a > b ? a = b, true : false; } bool chmax(auto &a, auto b) { return a < b ? a = b, true : false; } #include <atcoder/modint> using mint = atcoder::modint998244353; namespace combination { template<typename mint> struct C { static vector<mint> fac, finv; static void init(int n) { int sz = fac.size(); if (n < sz) return; n = clamp(n, 2 * sz, min(1 << 25, mint::mod() - 1)); fac.resize(n + 1); finv.resize(n + 1); for (int i = sz; i <= n; i++) { fac[i] = i * fac[i - 1]; } finv[n] = fac[n].inv(); for (int i = n; i >= sz; i--) { finv[i - 1] = i * finv[i]; } } }; template<typename mint> vector<mint> C<mint>::fac(1, 1); template<typename mint> vector<mint> C<mint>::finv(1, 1); template<typename mint> mint fac(int n) { C<mint>::init(n); if (n < 0) return 0; return C<mint>::fac[n]; } template<typename mint> mint finv(int n) { C<mint>::init(n); if (n < 0) return 0; return C<mint>::finv[n]; } template<typename mint> mint mod_inv(int n) { assert(n > 0); return finv<mint>(n) * fac<mint>(n - 1); } template<typename mint> mint nCk(int n, int k) { if (n < 0 || n < k || k < 0) return 0; return fac<mint>(n) * finv<mint>(n - k) * finv<mint>(k); } template<typename mint> mint multi_C(const vector<int> &v) { int n = 0; for (const int &k : v) n += k; mint res = fac<mint>(n); for (const int &k : v) res *= finv<mint>(k); return res; } template<typename mint> mint nPk(int n, int k) { if (n < 0 || n < k || k < 0) return 0; return fac<mint>(n) * finv<mint>(n - k); } template<typename mint> mint catalan(int n) { return fac<mint>(2 * n) * finv<mint>(n) * finv<mint>(n + 1); } template<typename mint> mint grid_path(int n, int m) { return nCk<mint>(n + m, n); } } // namespace combination int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector<int> P(N), inv(N); for (int i = 0; i < N; i++) { cin >> P[i]; inv[P[i]] = i; } mint ans = 1; int L = inv[0], R = inv[0]; vector<bool> seen(N, false); seen[0] = true; for (int p = 1; p < N; p++) { if (seen[p]) { ans *= R - L - p + 1; continue; } if (inv[p] < L) { for (int i = inv[p]; i < L; i++) { seen[P[i]] = true; } L = inv[p]; } else { assert(R < inv[p]); for (int i = R + 1; i <= inv[p]; i++) { seen[P[i]] = true; } R = inv[p]; } } cout << ans.val() << endl; }