Ex - Simple Path Counting Problem Editorial by Nyaan


公式解説で使用されている 鏡像法(反射原理 とも) と呼ばれるテクニックについて簡単に説明します。

次の問題を考えます。

地点 \(1\), 地点 \(2\), \(\dots\), 地点 \(M\) がある。あなたは地点 \(S\) にいる。
1 秒経つごとに今いる地点を \(x\) として地点 \(x+1\) か地点 \(x-1\) に移動できる。(地点 \(0\), 地点 \(M+1\) は存在しないので行けない)
\(N\) 秒後に地点 \(T\) にいるような経路は何通りあるか?(mod 998244353)

この問題は \(\mathrm{O}(M \log M \log N)\) で解けます。

頂点に \(鏡_1, 1, 2, \dots, M, 鏡_2, M', \dots, 2', 1'\) のラベルがこの順に貼られている \(2M+2\) 点の cycle graph を考えます。(図は \(M=5\) の場合)

image

求めたい答えは

  • (始点 \(S\), 終点 \(T\)\(鏡_1, 鏡_2\) を経由しない \(N+1\) 頂点の walk の個数)
    \(=\) (始点 \(S\), 終点 \(T\)\(N+1\) 頂点の walk の個数)
    \(-\) (始点 \(S\), 終点 \(T\)\(鏡_1, 鏡_2\) を経由する \(N+1\) 頂点の walk の個数)

です。(walk とは, 同じ頂点や同じ辺を何回も使ってよい経路のこと)
ここで、次の 2 つの集合の間に全単射が成り立つことが証明できます。

  • (始点 \(S\), 終点 \(T\)\(鏡_1, 鏡_2\) を経由する \(N+1\) 頂点の walk ) からなる集合
  • (始点 \(S'\), 終点 \(T\)\(N+1\) 頂点の walk ) からなる集合

(証明) 前者の集合から 1 つ walk を取り \(p\) とする。\(p\) が経由する頂点の列を \(S = v_0, v_1, \dots, v_N = T \) とする。
\(p\) にはじめて登場する \(鏡\)\(v_i\) であるとする。このとき、 \(v_0, v_1, \dots, v_{i-1}\) はすべて鏡から見て \(S\) 側 (つまりダッシュのつかない) 頂点となる。このとき、\(p\) に対応する walk \(q\) を次の条件を満たすように一意に取る。

  • 経由する頂点の列が \({v_0}', {v_1}', \dots, {v_{i-1}}', v_i, v_{i+1}, \dots, v_N\) である。(つまり、\(p\)\(v_j\) \((j \lt i)\) の範囲にダッシュをつけた頂点の列となる。)

\(1, 2, \dots, M\)\(1', 2', \dots, M'\) が鏡映しの関係にあること、および\({v_0}' = S', v_N = T\) であることから、 \(q\)\(S'\) から \(T\) への walk として正当であることが確認できる。
また、逆操作をすると後者の集合に含まれるパス \(q\) から \(p\) を復元することも可能であるから、2 つの集合の要素の間で一対一対応を取ることができる。(証明終わり)

よって、求めたい答えは

  • (始点 \(S\), 終点 \(T\)\(N+1\) 頂点の walk の個数)
    \(-\) (始点 \(S'\), 終点 \(T\)\(N+1\) 頂点の walk の個数)

で、DP で計算できる問題に帰着しました。これはナイーブな DP で \(\mathrm{O}(NM)\), 畳み込みで高速化して \(\mathrm{O}(M \log M \log N)\) で計算できます。
このテクニックを利用すると公式解説と同様の DP を導くことができます。

関連ブログ:noshi さんによるカタラン数の鏡像法による説明

出題例 (yukicoder, ARC ネタバレ注意)

posted:
last update: