結果
| 問題 | No.3600 Moving Queen Many Times |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-07-24 23:49:49 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 845 ms / 7,000 ms |
| + 299µs | |
| コード長 | 2,492 bytes |
| 記録 | |
| コンパイル時間 | 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 |
ソースコード
#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;
}