結果

問題 No.3600 Moving Queen Many Times
コンテスト
ユーザー shingo0909
提出日時 2026-07-24 23:49:49
言語 C++23
(gcc 15.2.0 + boost 1.90.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 845 ms / 7,000 ms
+ 299µs
コード長 2,492 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,971 ms
コンパイル使用メモリ 355,020 KB
実行使用メモリ 116,720 KB
最終ジャッジ日時 2026-07-24 23:50:02
合計ジャッジ時間 12,601 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 75
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <atcoder/modint>
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

using mint = atcoder::modint998244353;

vector<vector<mint>> mat_mul(vector<vector<mint>> a, vector<vector<mint>> b) {
    int n = a.size();
    vector ans(n, vector<mint>(n, 0));
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            for (int k = 0; k < n; k++) {
                ans[i][j] += a[i][k] * b[k][j];
            }
    return ans;
}

vector<vector<mint>> mat_pow(vector<vector<mint>> a, ll b) {
    int n = a.size();
    vector ans(n, vector<mint>(n, 0));
    for (int i = 0; i < n; i++)
        ans[i][i] = 1;
    while (b) {
        if (b % 2)
            ans = mat_mul(ans, a);
        a = mat_mul(a, a);
        b /= 2;
    }

    return ans;
}

int main() {
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);
    int h, w, sx, sy, gx, gy;
    ll k;
    cin >> h >> w;
    cin >> sx >> sy;
    cin >> gx >> gy;
    cin >> k;
    int m = h * w;
    auto tr = [&](int i, int j) {
        return i * w + j;
    };
    sx--;
    sy--;
    gx--;
    gy--;
    int s = tr(sx, sy);
    int t = tr(gx, gy);
    vector<vector<int>> g(m);
    rep(i, h) rep(j, w)
        rep(x, h) rep(y, w) {
        if (i == x && j == y)
            continue;
        if (i == x || j == y || abs(i - x) == abs(j - y)) {
            g[tr(i, j)].push_back(tr(x, y));
        }
    }
    vector<vector<mint>> mat;
    vector<vector<vector<mint>>> z;
    rep(x, m) {
        vector<vector<mint>> dp(1 << m, vector<mint>(m, 0));
        dp[0][x] = 1;
        rep(i, 1 << m) rep(j, m) {
            for (int k : g[j]) {
                if (i >> k & 1)
                    continue;
                dp[i ^ (1 << k)][k] += dp[i][j];
            }
        }
        z.push_back(dp);
        vector<mint> v;
        rep(i, m) v.push_back(dp.back()[i]);
        mat.push_back(v);
    }
    // rep(i, m) {
    //     rep(j, m) {
    //         cout << mat[i][j].val() << " ";
    //     }
    //     cout << endl;
    // }
    mat = mat_pow(mat, k / m);
    // rep(i, m) {
    //     rep(j, m) {
    //         cout << mat[i][j].val() << " ";
    //     }
    //     cout << endl;
    // }
    k %= m;
    mint ans = 0;
    rep(i, m) {
        rep(j, 1 << m) {
            if (__builtin_popcount(j) == k) {
                ans += mat[s][i] * z[i][j][t];
            }
        }
    }
    cout << ans.val() << endl;
    return 0;
}
0