B - Japanese "Knight's Tour" 解説
by
Nyaan
まず、\(H\) が偶数の場合は答えは \(0\) 通りです。(奇数段目に桂馬を置けないため) 以降では \(H\) が奇数の場合を考えます。
\(W\) が奇数の場合と偶数の場合で場合分けして解きますが、どちらも議論の内容はほぼ同じなので奇数の場合のみを説明します。
まず、桂馬の動きは少し考えづらいので、以降では行を適切に入れ替えて斜め下への移動に置き換えて説明します。
今回の問題は、全てのマスについて斜め下にあるどちらかのマスに有向辺を張ったときに、全体が 1 個の閉路となるような方法の個数を数える問題として考えることができます。
例えば \((0,0)\) から \((1,1)\) に辺を張ったとします。すると、\((2,0)\) から \((1,1)\) には辺が張れないことになるので \((2,0)\) を始点とする辺は \((3,1)\) へ向かうことになります。これを繰り返すと、\(W\) は奇数なので全ての \((0,\ast)\) について辺の行き先が決まります。特に、全ての \((0,\ast)
\) について左下と右下のどちらに辺を張るかが一致することになります。
よって、はじめの \(H\) 回の移動を決め打つ、すなわち辺を張る問題としては \((0,0)\) を始点として \(H\) 回辺に従って移動する方法を決め打つことにすると、同様の方法で全ての辺が確定することになります。
あとはこれが 1 個の閉路になっていればよいです。これは \(H\) 回移動した時の地点を \((i,0)\) とした時に \(\gcd(W,i)=1\) であることが必要十分であることが確認できます。(必要性は明らかで、十分性は \(i\) を固定した時に全ての \((i,\ast)\) について左下と右下のどちらに辺を張るかが一致していることから証明できる) 以上より条件がわかり、二項係数を用いれば答えを容易に計算できます。
\(W\) が偶数の場合もほぼ同様の考察で解けます。簡単に言うと、「はじめの \(H\) 回の移動」のところを「はじめの \(2H\) 回の移動」として同様の議論を行えばよいです。
以上よりこの問題を \(\mathrm{O}(H \log W)\) 程度で解くことができて、十分高速です。
投稿日時:
最終更新:
