結果
| 問題 | No.3600 Moving Queen Many Times |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-07-03 12:03:45 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 2,004 ms / 7,000 ms |
| + 945µs | |
| コード長 | 2,008 bytes |
| 記録 | |
| コンパイル時間 | 236 ms |
| コンパイル使用メモリ | 96,368 KB |
| 実行使用メモリ | 217,476 KB |
| 最終ジャッジ日時 | 2026-07-24 20:35:39 |
| 合計ジャッジ時間 | 23,450 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 75 |
ソースコード
mod = 998244353
h,w,sy,sx,gy,gx,KK = list(map(int,input().split()))
sy,sx,gy,gx = sy-1,sx-1,gy-1,gx-1
hw = h*w
s = [[[0 for i in range(2**hw)] for u in range(hw)]for k in range(hw)]
for y in range(h):
for x in range(w):
xy = y*w+x
for Y in range(h):
for X in range(w):
XY = Y*w+X
if xy == XY:
continue
if y == Y or x == X or x+y == X+Y or x-y == X-Y:
s[xy][XY][1<<XY] = 1
for i in range(hw):
for bit in range(2**hw):
for y in range(h):
for x in range(w):
xy = y*w+x
if bit&(1<<xy) == 0:
continue
for Y in range(h):
for X in range(w):
XY = Y*w+X
if bit&(1<<XY):
continue
if y == Y or x == X or x+y == X+Y or x-y == X-Y:
s[i][XY][bit|(1<<XY)] += s[i][xy][bit]
s[i][XY][bit|(1<<XY)] %= mod
t = [[s[i][u][2**hw-1] for u in range(hw)] for i in range(hw)]
out = [0 for i in range(hw)]
out[sy*w+sx] = 1
K = KK//hw
while K:
if K&1:
a = [0 for i in range(hw)]
for i in range(hw):
for u in range(hw):
a[u] += out[i]*t[i][u]
a[u] %= mod
out = a[:]
b = [[0 for i in range(hw)] for u in range(hw)]
for i in range(hw):
for u in range(hw):
for k in range(hw):
b[i][k] += t[i][u]*t[u][k]
b[i][k] %= mod
t = b[:]
K //= 2
K = KK%hw
ans = 0
if K:
for bit in range(2**hw):
c = 0
for i in range(hw):
if bit&(1<<i):
c += 1
if c != K:
continue
for i in range(hw):
ans += out[i]*s[i][gy*w+gx][bit]
ans %= mod
elif K == 0:
ans += out[gy*w+gx]
ans %= mod
print(ans)