結果
問題 |
No.3145 Astral Parentheses Sequence
|
ユーザー |
|
提出日時 | 2025-05-16 23:23:05 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 850 ms / 2,000 ms |
コード長 | 960 bytes |
コンパイル時間 | 4,387 ms |
コンパイル使用メモリ | 262,284 KB |
実行使用メモリ | 7,844 KB |
最終ジャッジ日時 | 2025-05-16 23:23:24 |
合計ジャッジ時間 | 17,898 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 45 |
ソースコード
#include <bits/stdc++.h> #include <atcoder/all> using namespace std; using ll = long long; using mint = atcoder::modint; /* (X)(Y) (*(X)) ((X)*) (*(*)(*)) ((*)*(*)) */ int main(){ int n, m; cin >> n >> m; if(n % 3 != 0){ cout << "0\n"; return 0; } n /= 3; mint::set_mod(m); vector<vector<mint>> dp(n + 1, vector<mint>(n + 1)); vector<vector<mint>> dp2(n + 1, vector<mint>(n + 1)); vector used(2, vector(n + 1, vector<bool>(n + 1))); auto rec = [&](auto rec, int l, int r, int s) -> mint { if(l == r) return 1; if(l + 1 == r) return 1; mint res = 0; if(s == 0){ if(used[s][l][r]) return dp[l][r]; res += rec(rec, l, r, 1); for(int m = l + 1; m < r; m++){ res += rec(rec, l, m, 1) * rec(rec, m, r, 0); } used[s][l][r] = true; return dp[l][r] = res; } if(used[s][l][r]) return dp2[l][r]; for(int m = l; m < r; m++){ res += rec(rec, l, m, 0) * rec(rec, m + 1, r, 0); } used[s][l][r] = true; return dp2[l][r] = res; }; cout << rec(rec, 0, n, 0).val() << '\n'; }