結果
| 問題 | No.3600 Moving Queen Many Times |
| コンテスト | |
| ユーザー |
tau1235
|
| 提出日時 | 2026-07-24 22:56:13 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 1,056 ms / 7,000 ms |
| + 846µs | |
| コード長 | 1,365 bytes |
| 記録 | |
| コンパイル時間 | 2,433 ms |
| コンパイル使用メモリ | 353,868 KB |
| 実行使用メモリ | 74,368 KB |
| 最終ジャッジ日時 | 2026-07-24 22:56:36 |
| 合計ジャッジ時間 | 13,123 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 75 |
ソースコード
#include<bits/stdc++.h>
#include<atcoder/modint>
using namespace std;
void solve(){
auto f=[&](int i1,int j1,int i2,int j2){
int di=abs(i1-i2),dj=abs(j1-j2);
if (di==0&&dj==0) return true;
if (di==0||dj==0||di==dj) return true;
return false;
};
using ll=long long;
using mint=atcoder::modint998244353;
ll h,w,sx,sy,gx,gy,k;
cin>>h>>w>>sx>>sy>>gx>>gy>>k;
sx--;sy--;gx--;gy--;
int n=h*w;
vector dp(n,vector(n,vector<mint>(1<<n)));
for (int i=0;i<n;i++) dp[i][i][0]=1;
for (int bit=0;bit<1<<n;bit++){
for (int i=0;i<n;i++) for (int j=0;j<n;j++) for (int k=0;k<n;k++){
if (f(j/w,j%w,k/w,k%w)&&!(bit>>j&1)&&j!=k) dp[i][j][bit^(1<<j)]+=dp[i][k][bit];
}
}
using V=vector<vector<mint>>;
V dp2(n,vector<mint>(n)),pw=dp2;
for (int i=0;i<n;i++) for (int j=0;j<n;j++) pw[i][j]=dp[i][j][(1<<n)-1];
for (int i=0;i<n;i++) dp2[i][i]=1;
auto merge=[&](V a,V b){
V c(n,vector<mint>(n));
for (int i=0;i<n;i++) for (int j=0;j<n;j++) for (int k=0;k<n;k++){
c[i][k]+=a[i][j]*b[j][k];
}
return c;
};
ll k2=k%n;
k/=n;
while (k){
if (k&1) dp2=merge(dp2,pw);
pw=merge(pw,pw);
k/=2;
}
mint ans=0;
for (int bit=0;bit<1<<n;bit++){
if (__builtin_popcount(bit)!=k2) continue;
for (int i=0;i<n;i++){
ans+=dp2[sx*w+sy][i]*dp[i][gx*w+gy][bit];
}
}
cout<<ans.val()<<endl;
}
int main(){
int t=1;
//cin>>t;
while (t--) solve();
}
tau1235