提出 #28081036


ソースコード 拡げる

#include <bits/stdc++.h>
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define rep(i,n) for (int i = 0; i < (n); ++i)
#define rep2(i,k,n) for (int i = (k); i < (n); ++i)
using namespace std;
using ll = long long;
using P = pair<int,int>;
// using P = pair<ll,ll>;

// const ll INF = (ll)1e18;
// const int INF = (int)1e9+7;
template<typename T>
void chmin(T &a, T b) { a = min(a, b); }
template<typename T>
void chmax(T &a, T b) { a = max(a, b); }


const ll MOD = 998244353;
using Matrix = vector<vector<ll>>;

Matrix transitionMatrix(ll H, ll W) {
    return {
        {H+W-4, W-1, H-1, 0},
        {1, H-2, 0, H-1},
        {1, 0, W-2, W-1},
        {0, 1, 1, 0},
    };
}

Matrix mulMat(Matrix A, Matrix B) {
    Matrix C(4, vector<ll>(4));

    rep(i,4) {
        rep(j,4) {
            rep(k,4) {
                C[i][j] += A[i][k] * B[k][j];
                C[i][j] %= MOD;
            }
        }
    }

    return C;
}

Matrix expMatMod(Matrix A, ll K) {
    Matrix ans = Matrix(4, vector<ll>(4, 0));
    Matrix mat = Matrix(4, vector<ll>(4, 0));
    rep(i,4) ans[i][i] = 1;
    rep(i,4) mat[i][i] = 1;

    for (ll i = 0;; i++) {
        if (i == 0) mat = A;
        else mat = mulMat(mat, mat);

        if (K&1) ans = mulMat(ans, mat);
        K/=2;
        if (K == 0) break;
    }

    return ans;
}

void solve() {
    ll H, W, K;
    cin >> H >> W >> K;
    ll x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2;

    Matrix trans = transitionMatrix(H, W);
    vector<ll> state(4, 0);

    int stateidx = ((x1==x2) << 1) + (y1==y2);
    state[stateidx] = 1;

    Matrix A = expMatMod(trans, K);
    // vector<ll> ans(4, 0);
    // rep(i,4) {
    //     rep(j,4) {
    //         ans[i] += A[i][j] * state[j];
    //     }
    // }
    // 
    // cout << ans[3] << endl;

    cout << A[3][stateidx] << endl;
}

int main() {
    solve();
    return 0;
}

提出情報

提出日時
問題 E - Rook Path
ユーザ goropikari
言語 C++ (GCC 9.2.1)
得点 500
コード長 1988 Byte
結果 AC
実行時間 8 ms
メモリ 3604 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 500 / 500
結果
AC × 3
AC × 26
セット名 テストケース
Sample example_00.txt, example_01.txt, example_02.txt
All example_00.txt, example_01.txt, example_02.txt, test_00.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt
ケース名 結果 実行時間 メモリ
example_00.txt AC 8 ms 3492 KiB
example_01.txt AC 2 ms 3556 KiB
example_02.txt AC 2 ms 3420 KiB
test_00.txt AC 2 ms 3436 KiB
test_01.txt AC 4 ms 3600 KiB
test_02.txt AC 3 ms 3496 KiB
test_03.txt AC 2 ms 3488 KiB
test_04.txt AC 2 ms 3600 KiB
test_05.txt AC 2 ms 3528 KiB
test_06.txt AC 2 ms 3604 KiB
test_07.txt AC 2 ms 3440 KiB
test_08.txt AC 2 ms 3600 KiB
test_09.txt AC 3 ms 3600 KiB
test_10.txt AC 2 ms 3420 KiB
test_11.txt AC 2 ms 3460 KiB
test_12.txt AC 2 ms 3540 KiB
test_13.txt AC 2 ms 3420 KiB
test_14.txt AC 2 ms 3536 KiB
test_15.txt AC 2 ms 3548 KiB
test_16.txt AC 3 ms 3492 KiB
test_17.txt AC 2 ms 3596 KiB
test_18.txt AC 3 ms 3488 KiB
test_19.txt AC 2 ms 3488 KiB
test_20.txt AC 3 ms 3496 KiB
test_21.txt AC 2 ms 3460 KiB
test_22.txt AC 2 ms 3420 KiB