結果
問題 |
No.3098 Linear Reversi
|
ユーザー |
|
提出日時 | 2025-03-09 12:00:22 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 3,042 bytes |
コンパイル時間 | 3,890 ms |
コンパイル使用メモリ | 231,072 KB |
実行使用メモリ | 267,700 KB |
最終ジャッジ日時 | 2025-04-06 15:00:40 |
合計ジャッジ時間 | 7,473 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 7 WA * 30 |
ソースコード
#include <bits/stdc++.h> #include <atcoder/all> using namespace std; using namespace atcoder; typedef int64_t ll; using mint = modint998244353; typedef long double ld; const ll MOD = 1000000007; const ll MODA = 998244353; ll vx[4] = {0, 1, 0, -1}; ll vy[4] = {1, 0, -1, 0}; #define rep(i, n) for (ll i = 0; i < (ll)(n); i++) long long gcd(long long a, long long b) { a = abs(a); b = abs(b); ll gcdmax = max(a, b); ll gcdmin = min(a, b); if (gcdmin == 0) return gcdmax; while (true) { if (gcdmax % gcdmin == 0) break; else gcdmax %= gcdmin; swap(gcdmin, gcdmax); } return gcdmin; } ll pow(ll N, ll P, ll M) { if (P == 0) return 1; else if (P % 2 == 0) { ll t = pow(N, P / 2, M); return t * t % M; } else return N * pow(N, P - 1, M) % M; } ll pow(ll N, ll P) { if (P == 0) return 1; else if (P % 2 == 0) { ll t = pow(N, P / 2); return t * t; } else return N * pow(N, P - 1); } vector<ll> fac; vector<ll> finv; vector<ll> inv; void COMinit(ll N, ll P) { rep(i, N + 1) { if (i == 0) { fac.push_back(1); finv.push_back(1); inv.push_back(1); } else if (i == 1) { fac.push_back(1); finv.push_back(1); inv.push_back(1); } else { fac.push_back(fac.at(i - 1) * i % P); inv.push_back(P - inv.at(P % i) * (P / i) % P); finv.push_back(finv.at(i - 1) * inv.at(i) % P); } } } ll COM(ll n, ll k, ll P) { if (n < k) return 0; if (n < 0 || k < 0) return 0; return fac.at(n) * (finv.at(k) * finv.at(n - k) % P) % P; } int main() { ll n; cin >> n; string S; cin >> S; vector<vector<vector<vector<mint>>>> dp(n, vector<vector<vector<mint>>>(2, vector<vector<mint>>(2, vector<mint>(2)))); rep(i, n) { if (i == 0) { if (S[i] == 'o') dp[i][1][0][1] = 1; else if (S[i] == 'x') dp[i][0][0][1] = 1; else dp[i][1][0][1] = 1, dp[i][0][0][1] = 1; continue; } if (S[i] != 'x') { dp[i][1][0][0] = dp[i - 1][0][0][1]; dp[i][1][0][1] = dp[i - 1][1][0][0] + dp[i - 1][1][0][1]; dp[i][1][1][0] = dp[i - 1][0][1][1] + dp[i - 1][0][0][0]; dp[i][1][1][1] = dp[i - 1][1][1][0] + dp[i - 1][1][1][1]; } if (S[i] != 'o') { dp[i][0][0][0] = dp[i - 1][1][0][1]; dp[i][0][0][1] = dp[i - 1][0][0][0] + dp[i - 1][0][0][1]; dp[i][0][1][0] = dp[i - 1][1][1][1] + dp[i - 1][1][0][0]; dp[i][0][1][1] = dp[i - 1][0][1][0] + dp[i - 1][0][1][1]; } } mint ans = 0; rep(i, 2) rep(j, 2) rep(k, 2) { ans += dp[n - 1][i][j][k]; } cout << ans.val() << endl; }