結果
問題 |
No.3099 Parentheses Decomposition
|
ユーザー |
![]() |
提出日時 | 2025-05-04 19:11:14 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 9 ms / 2,000 ms |
コード長 | 2,288 bytes |
コンパイル時間 | 3,876 ms |
コンパイル使用メモリ | 280,388 KB |
実行使用メモリ | 7,848 KB |
最終ジャッジ日時 | 2025-05-04 19:11:20 |
合計ジャッジ時間 | 4,679 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 20 |
ソースコード
#include <bits/stdc++.h> using namespace std; #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)); n = min(max(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 using namespace combination; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; string S; cin >> N >> S; N /= 2; mint ans = 0; if (S[1] == '(') { // A for (int k = 0; k <= N; k++) { ans += nCk<mint>(N, k).pow(2); } } else { // B ans = mint(2).pow(N); } cout << ans.val() << endl; }