結果

問題 No.2783 4-33 Easy
ユーザー Today03Today03
提出日時 2024-06-14 22:07:51
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 41 ms / 2,000 ms
コード長 4,525 bytes
コンパイル時間 2,239 ms
コンパイル使用メモリ 211,240 KB
実行使用メモリ 56,932 KB
最終ジャッジ日時 2024-06-14 22:07:56
合計ジャッジ時間 4,557 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 22 ms
56,548 KB
testcase_01 AC 18 ms
56,676 KB
testcase_02 AC 19 ms
56,804 KB
testcase_03 AC 18 ms
56,672 KB
testcase_04 AC 32 ms
56,672 KB
testcase_05 AC 40 ms
56,804 KB
testcase_06 AC 39 ms
56,804 KB
testcase_07 AC 40 ms
56,804 KB
testcase_08 AC 40 ms
56,804 KB
testcase_09 AC 38 ms
56,808 KB
testcase_10 AC 38 ms
56,932 KB
testcase_11 AC 39 ms
56,804 KB
testcase_12 AC 39 ms
56,932 KB
testcase_13 AC 38 ms
56,804 KB
testcase_14 AC 39 ms
56,932 KB
testcase_15 AC 39 ms
56,804 KB
testcase_16 AC 38 ms
56,804 KB
testcase_17 AC 38 ms
56,804 KB
testcase_18 AC 39 ms
56,932 KB
testcase_19 AC 39 ms
56,808 KB
testcase_20 AC 39 ms
56,676 KB
testcase_21 AC 39 ms
56,804 KB
testcase_22 AC 38 ms
56,804 KB
testcase_23 AC 39 ms
56,808 KB
testcase_24 AC 38 ms
56,932 KB
testcase_25 AC 41 ms
56,932 KB
testcase_26 AC 40 ms
56,800 KB
testcase_27 AC 39 ms
56,808 KB
testcase_28 AC 39 ms
56,928 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
const int INF = 1e9 + 10;
const ll INFL = 4e18;

template <ll MOD>
struct modint {
    ll value;
    modint(ll x = 0) {
        if (x >= 0) {
            value = x % MOD;
        } else {
            value = MOD - (-x) % MOD;
        }
    }
    modint operator-() const {
        return modint(-value);
    }
    modint operator+() const {
        return modint(*this);
    }
    modint &operator+=(const modint &other) {
        value += other.value;
        if (value >= MOD) {
            value -= MOD;
        }
        return *this;
    }
    modint &operator-=(const modint &other) {
        value += MOD - other.value;
        if (value >= MOD) {
            value -= MOD;
        }
        return *this;
    }
    modint &operator*=(const modint other) {
        value = value * other.value % MOD;
        return *this;
    }
    modint &operator/=(modint other) {
        (*this) *= other.inv();
        return *this;
    }
    modint operator+(const modint &other) const {
        return modint(*this) += other;
    }
    modint operator-(const modint &other) const {
        return modint(*this) -= other;
    }
    modint operator*(const modint &other) const {
        return modint(*this) *= other;
    }
    modint operator/(const modint &other) const {
        return modint(*this) /= other;
    }
    modint pow(ll x) const {
        modint ret(1), mul(value);
        while (x) {
            if (x & 1) {
                ret *= mul;
            }
            mul *= mul;
            x >>= 1;
        }
        return ret;
    }
    modint inv() const {
        return pow(MOD - 2);
    }
    bool operator==(const modint &other) const {
        return value == other.value;
    }
    bool operator!=(const modint &other) const {
        return value != other.value;
    }
    friend ostream &operator<<(ostream &os, const modint &x) {
        return os << x.value;
    }
    friend istream &operator>>(istream &is, modint &x) {
        ll v;
        is >> v;
        x = modint<MOD>(v);
        return is;
    }
};
using mod998 = modint<998244353>;
using mod107 = modint<1000000007>;

using mint = mod998;

mint dp1[2001][10][5][34], dp2[2001][10][5][34];

int main() {
    int N;
    cin >> N;
    vector<int> A(N);
    vector<string> B(N);
    for (int i = 0; i < N; i++) {
        cin >> A[i];
    }
    for (int i = 0; i < N; i++) {
        cin >> B[i];
    }
    auto C = A;
    auto D = B;
    reverse(C.begin(), C.end());
    reverse(D.begin(), D.end());

    dp1[0][0][0][0] = 1;
    dp2[0][0][0][0] = 1;
    for (int i = 0; i < N; i++) {
        string bi = B[i];
        string di = D[i];
        int bs = B[i].back() == 'X';
        int ds = D[i].back() == 'X';
        if (bi.back() == 'X') {
            bi.pop_back();
            if (bi == "") {
                bi = "0";
            }
        }
        if (di.back() == 'X') {
            di.pop_back();
            if (di == "") {
                di = "0";
            }
        }
        int b = stoi(bi), d = stoi(di);

        for (int j = 0; j <= 8; j++) {
            for (int k = 0; k <= 4; k++) {
                for (int l = 0; l <= 33; l++) {
                    dp1[i + 1][j][k][l] += dp1[i][j][k][l];
                    dp2[i + 1][j][k][l] += dp2[i][j][k][l];

                    if (j + 1 <= 8 && k + A[i] <= 4 && l + b <= 33 && !bs) {
                        dp1[i + 1][j + 1][k + A[i]][l + b] += dp1[i][j][k][l];
                    }
                    if (j + 1 <= 8 && k + C[i] <= 4 && l + d <= 33 && !ds) {
                        dp2[i + 1][j + 1][k + C[i]][l + d] += dp2[i][j][k][l];
                    }
                }
            }
        }
    }

    mint ans = 0;

    for (int i = 0; i < N; i++) {
        string bi = B[i];
        int bs = B[i].back() == 'X';
        if (bi.back() == 'X') {
            bi.pop_back();
            if (bi == "") {
                bi = "0";
            }
        }
        int b = stoi(bi);

        if (4 < 33 && !bs) {
            continue;
        }
        if (b != 0 && 4 < 33 - 4) {
            continue;
        }

        for (int j = 0; j <= 8; j++) {
            for (int k = 0; k <= 4 - A[i]; k++) {
                for (int l = 0; l <= 33 - b; l++) {
                    int nj = 8 - j, nk = 4 - A[i] - k, nl = 33 - b - l;
                    ans += dp1[i][j][k][l] * dp2[N - 1 - i][nj][nk][nl];
                }
            }
        }
    }

    cout << ans << endl;
}
0