公式

F - XOR on Grid Path 解説 by KoD


排他的論理和のことを XOR と呼び、非負整数 \(x, y\) の XOR を \(x \oplus y\) で表すことにします。

マス \((1, 1)\) からマス \((N, N)\) に移動する方法は全部で \(\binom{2N - 2}{N - 1}\) 通りあり、この問題の制約では最大で約 \(3.5 × 10^{10}\) 通りとなります。よって、全ての移動方法を試していては実行時間制限に間に合いません。
そこで、半分全列挙と呼ばれる手法を用います。大雑把に説明すると、\(S\) 通りある対象をサイズ \(\sqrt{S}\) 程度の二つの集合の直積集合に対応させ、それらを処理することで高速化を図る手法です。

マス \((1, 1)\) からマス \((N, N)\) に移動するとき、マス目の対角線上のマス、すなわち \(x + y = N + 1\) を満たすマス \((x, y)\) をただ一つ通ります。ある移動方法について、マス \((1, 1)\) からマス \((x, y)\) に通るマスに書かれた整数の XOR を \(p\)、マス \((x, y)\) からマス \((N, N)\) まで移動する過程で通るマスに書かれた整数の XOR を \(q\) とおくと、この移動方法が問題文中の条件を満たすことは \(p \oplus a_{x, y} \oplus q = 0\) と同値です。

よって、マス \((1, 1)\) からマス \((x, y)\) に移動する全ての方法について通るマスに書かれた整数の XOR を列挙した多重集合を \(P\) とおき、マス \((x, y)\) からマス \((N, N)\) に移動する方法についても同様に \(Q\) を定めると、問題文中の条件を満たすパスであって \((x, y)\) を通るものの総数は、\(p \in P, q \in Q, p \oplus a_{x, y} \oplus q = 0\) を満たす組 \((p, q)\) の個数に等しいです。これはソートや二分探索を用いて \(O((|P| + |Q|) \log (|P| + |Q|))\) で計算することができます。

\(|P| = |Q|\) であり、全ての対角線上のマス \((x, y)\) について \(|P|\) を合計した値は \(2^{N - 1}\) であるので、この問題を \(O(N2^{N})\) で解くことができました。

実装例 (C++)

投稿日時:
最終更新: