結果
問題 | No.2964 Obstruction Bingo |
ユーザー |
![]() |
提出日時 | 2025-01-04 12:04:40 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 267 ms / 2,468 ms |
コード長 | 4,864 bytes |
コンパイル時間 | 6,282 ms |
コンパイル使用メモリ | 322,532 KB |
実行使用メモリ | 42,924 KB |
最終ジャッジ日時 | 2025-01-04 12:04:56 |
合計ジャッジ時間 | 15,482 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 49 |
ソースコード
#include <bits/stdc++.h> #define FOR(i, a, b) for(ll i = (a); i < (b); i++) #define REP(i, a) FOR(i, 0, a) using namespace std; using ll = long long; const ll MOD = 998244353; struct mll{ ll x; mll(ll _x = 0){ x = (_x % MOD + MOD) % MOD; } }; ostream& operator<<(ostream &os, mll n){ os << n.x; return os; } template <> struct std::formatter<mll> : formatter<ll> { auto format(mll m, format_context &ctx) const { return formatter<ll>::format(m.x, ctx); } }; mll operator +(mll a, mll b){ return mll(a.x + b.x); } mll operator -(mll a, mll b) { return mll(a.x - b.x); } void operator +=(mll &a, mll b) { a = a + b; } void operator -=(mll &a, mll b) { a = a - b; } mll operator *(mll a, mll b){ return mll(a.x * b.x); } void operator *=(mll &a, mll b){ a = a * b; } mll mpw(mll n, ll m){ if(m < 0){ n = mpw(n, MOD - 2); m *= -1; } mll ret(1), p = n; while(m){ if(m & 1){ ret *= p; } p *= p; m >>= 1; } return ret; } mll minv(mll n){ return mpw(n, -1); } mll operator /(mll a, mll b){ return a * minv(b); } const ll MAX_L = 50, MAX_K = 500; mll dp_n[MAX_L][MAX_L][2][MAX_K + 1]; mll dp_m[MAX_L][MAX_L][2][MAX_K + 1]; int main(){ ios::sync_with_stdio(false); cin.tie(NULL); ll L, K; cin >> L >> K; string strS, strT; cin >> strS >> strT; vector<ll> S(L), T(L); REP(i, L){ S[i] = strS[i] - 'a'; T[i] = strT[i] - 'a'; } vector<ll> a(26); REP(i, 26) cin >> a[i]; ll sm_a = accumulate(a.begin(), a.end(), 0); mll sm_a_inv = minv(sm_a); vector<mll> prob(26); REP(i, 26) prob[i] = mll(a[i]) * sm_a_inv; FOR(k, 1, K + 1) { REP(n, L) { REP(m, L) { REP(flg, 2) { mll probS = prob[S[n]], probT = prob[T[m]]; if (S[n] == T[m]) { mll prob_other = 1 - probS; dp_n[n][m][flg][k] = dp_n[(n + 1) % L][(m + 1) % L][flg][k - 1] * probS + dp_n[n][m][flg][k - 1] * prob_other; dp_m[n][m][flg][k] = dp_m[(n + 1) % L][(m + 1) % L][flg][k - 1] * probS + dp_m[n][m][flg][k - 1] * prob_other; } else { mll prob_other = 1 - probS - probT; if (L == 1) { dp_n[n][m][flg][k] = probS + dp_n[n][m][flg][k - 1] * prob_other; dp_m[n][m][flg][k] = probT + dp_m[n][m][flg][k - 1] * prob_other; } else if (n == m) { dp_n[n][m][flg][k] = dp_n[(n + 1) % L][m][0][k - 1] * probS + dp_n[n][(m + 1) % L][1][k - 1] * probT + dp_n[n][m][flg][k - 1] * prob_other; dp_m[n][m][flg][k] = dp_m[(n + 1) % L][m][0][k - 1] * probS + dp_m[n][(m + 1) % L][1][k - 1] * probT + dp_m[n][m][flg][k - 1] * prob_other; } else if (flg == 0 && (n + 1) % L == m) { dp_n[n][m][flg][k] = probS + dp_n[n][(m + 1) % L][flg][k - 1] * probT + dp_n[n][m][flg][k - 1] * prob_other; dp_m[n][m][flg][k] = dp_m[n][(m + 1) % L][flg][k - 1] * probT + dp_m[n][m][flg][k - 1] * prob_other; } else if (flg == 1 && (m + 1) % L == n) { dp_n[n][m][flg][k] = dp_n[(n + 1) % L][m][flg][k - 1] * probS + dp_n[n][m][flg][k - 1] * prob_other; dp_m[n][m][flg][k] = dp_m[(n + 1) % L][m][flg][k - 1] * probS + probT + dp_m[n][m][flg][k - 1] * prob_other; } else { dp_n[n][m][flg][k] = dp_n[(n + 1) % L][m][flg][k - 1] * probS + dp_n[n][(m + 1) % L][flg][k - 1] * probT + dp_n[n][m][flg][k - 1] * prob_other; dp_m[n][m][flg][k] = dp_m[(n + 1) % L][m][flg][k - 1] * probS + dp_m[n][(m + 1) % L][flg][k - 1] * probT + dp_m[n][m][flg][k - 1] * prob_other; } } } } } } cout << format("{} {}", dp_n[0][0][0][K], dp_m[0][0][0][K]) << endl; }