今の所、過去問並べただけ。
目次
後退解析
非不偏ゲームの遷移は、各ゲームを頂点とする有向グラフ \(G\) で表すことができる。勝敗は \(v \in V(G)\) について
- \(v\) が \(\mathcal{P}\) のとき、任意の \(v’ \in v\) は \(\mathcal{N}\)
- \(v\) について、任意の \(v’ \in v\) が \(\mathcal{N}\) のとき、\(v\) は \(\mathcal{P}\)
である。\(\mathcal{P}\) であることが確定している頂点から順に決定すればよい。勝敗の確定しなかった頂点は勝敗の確定しなかった頂点に遷移するのが最適である。従って、永遠に勝敗が決まらず、\(\mathcal{D}\) である。将棋ではこのような状態を避けるため、同一局面が4回現れると引き分けとする、千日手が設定されている。
\(\delta^+(v) = \emptyset\) のとき \( v \in \mathcal{P}_0\) とする。先手がどのように指しても後手が \(n\) 手以下で \(\mathcal{P}_0\) にできる局面を \(\mathcal{P}_n\) とする。つまり、\(\forall u \in \delta^+(v), \exists w \in \delta^+(u), \exists k, 1 \leq k \leq n \land v \in \mathcal{P_k}\) のとき \(v \in \mathcal{P}_{n+1}\) とする。明らかに \(\mathcal{P}_n \subset \mathcal{P}_{n+1}\) である。有向グラフ \(G, H\) で表される二つのゲームの和は、有向グラフ \(G \times H\) で表せる。
ニム数が未確定の頂点は、暫定的にニム数を \(\infty\) として、帰納的にニム数を計算していく。\(m = \mathrm{mex}_{v’ \in v}(\mathcal G(v’))\) とする。\(\mathcal{G}(v’) > m\) となる任意の \(v’\) が有限回打ち消し可能な選択肢であることが分かっているとき、\(\mathcal{G}(v) = m\) としていく。それ以上更新ができなくなったところで、ニム数が \(\infty\) である頂点 \(v\) は \(\mathcal{G}(v) = \infty(\mathcal{A})\) とする。ただし、\(\mathcal{A} = \{a \in \mathbb{N}:a = \mathcal{G}(v
‘) : v’ \in v\}\) である。\(\mathcal{P}\) からは \(\mathcal{N}\) にしか遷移できず、\(\mathcal{N}\) からは \(\mathcal{P}\) に遷移できるので、\(\mathcal{P}\) から \(\mathcal{N}\) への遷移は打ち消し可能な選択肢であるが、打ち消し可能な回数で帰納法をすることにより、打ち消し可能な回数は有限回であることが分かる。\(v\) の打ち消し可能な回数を \(\mathrm{rank}(v)\) と置く。
- \(\mathcal{G}(v) = 0\) \(\Leftrightarrow\) \(v\) は \(\mathcal{P}\) 局面
- \(\mathcal{G}(v)\) が正整数ならば \(v\) は \(\mathcal{N}\) 局面
- \(\mathcal{G}(v) = \infty(\mathcal{A})\) で \(0 \in \mathcal{A}\) ならば、\(v\) は \(\mathcal{N}\) 局面
- \(\mathcal{G}(v) = \infty(\mathcal{A})\) で \(0 \not\in \mathcal{A}\) ならば、\(v\) は \(\mathcal{D}\) 局面
\(\mathrm{rank}(u) = \infty\) ならば \(v\) に関わらず \(\mathrm{rank}(u+v) = \infty\) である。ここから、ゲームの和のニム数は
$$\mathcal{G}(u + v) = \mathcal{G}(u) \oplus \mathcal{G}(v)$$
となる。ただし、\(\infty(\mathcal{A})\oplus \infty(\mathcal B) = \infty(\emptyset), \infty(\mathcal{A})\oplus b = \infty(\mathcal{A}\oplus b) = \infty(\{a \oplus b : a \in \mathcal{A}\})\) とする。
非不偏ゲームで A から B の遷移があり、A の帰結類を求める場合、A の選択肢と B の選択肢の共通部分に \(\mathcal{P}\) がある場合とそうでない場合で場合分けができる。前者の場合、A は \(\mathcal{N}\) である。後者の場合は、共通部分を全て存在しないものとしてゲームを解析できる。
\(\mathcal P\) に接続する頂点は全て \(\mathcal N\) である。例えば Wythoff’s game で同じx座標の \(\mathcal P\) 局面が二つ以上ないのはこの事実からすぐに分かる。
ニム数 \(n\) の頂点が存在する最小のグラフは \(K^{n+1}\) を頂点番号の小さい方から大きい方へ向きづけたグラフである。従って、辺は少なくとも \(\Theta(n^2)\) 個必要である。ニム数は、ゲームの誕生日の順に頂点を貪欲に彩色したときの色数に等しい。
DAGの後退解析
DAGの場合、後退解析は簡略化できる。閉路が存在しないので、勝敗が決まらない頂点は存在しない。
- ゲームの終了状態に、勝敗を割り振る。
- 勝敗が未確定の頂点を、一時的に、負け状態と仮定する。
- トポロジカル順序の逆順に頂点 \(v\) を見る。
- \(v\) が勝ちなら何もしない。\(v\) が負けなら、\(v\) に遷移可能な頂点を勝ちにする。
トポロジカル順序が自明ならば、手で勝敗が簡単に書き下せる場合がある。
DAGの後退解析をすればよい。先手の敗北条件は \(N = 0 \pmod {K+1} \) である。
DAGの後退解析。
DAGの後退解析。「直前に相手が \(x\) 個取り除いてなければ」勝ちという条件を論理和で配るので、各頂点の状態は
- 負け
- 直前に相手が \(x\) 個取り除いなければ、勝ち
- 直前に相手が何個取り除いていようが、勝ち
のいずれか。1つ目の状態が最短でも \(K+1\) 個おきにしか起きないので、更新回数は全体で \(O(N)\) になる。
DAGの後退解析。問題2の類題。
- 駒を辺に沿って動かす。
- ゲームを終了する。
のどちらかを選ぶ。十分長いターンが経ってもまだゲームが終了していないときは、後手の手番後に強制終了する。ゲームが終了したときに、駒が置いてある頂点の数字を先手は最大化、後手は最小化したい。数字はいくつになるか。(ARC038D)
スコアについて二分探索すると後退解析になる。
いくつかの根付き木が与えられる。交互に次のいずれかの操作を繰り返す。
- 1ターン目ならば駒を好きな木の根に置く。
- 葉でなければ、駒を子に移動する
- 葉であれば、まだ選ばれていない木の根に駒を移動する
操作できなくなったほうが負け。どちらが勝つか。
(Kupc2019E)
木の根を選び、葉まで駒を動かしてから、次の根を選ぶのが先手後手のどちらになっているか考える。
- 先手の意思で、先手後手を入れ替えることができる
- 先手の意思で、先手後手をそのままにすることができる
(True, True) を選ぶと先手の勝ち。(False, False) を選ぶと後手の勝ち。従って (False, False) が選ばれるのは最後。(True, False) ならば先手後手は必ず入れ替わる。(False, True) ならば先手後手は必ずそのまま。従って、(False, True) は勝敗と無関係。
勝敗の単調性
あるパラメータ A が大きいほど先手が有利ならば、
- \(f_1(S, a) :=\) 状態 S でパラメータ A = a のときの勝敗
を持つ dp から
- \(f_2(S) :=\) 状態 S のとき、先手が勝つための A の最小値
を持つ dp に変更でき、状態数が減らせる。
X さんにとっての必勝法が存在するゲームを考える。X さんにとって、局面 \(B\) が局面 \(A\) と比べて劣勢であるとする。ならば、\(A\) に遷移した後に、\(B\) に遷移しないような必勝法が存在する。つまり、Xさんにとって B が A に比べて劣勢であるとき、\(A < B\) と定めると、局面が \(G_1, G_2, \ldots \)の順で遷移して、 \(i < j\) のとき \(G_i > G_j\) または \(G_i, G_j\) が比較不能が成り立つようなものが存在する。
N 個の石が相異なる非負整数座標 \(x_1, x_2, \ldots, x_N\) (\(0 < x_1 \leq \cdots < x_N\)) に置かれている。交互に、最も大きい座標に置かれている石を、他の石と重ならないように、より小さい非負整数座標に置き換える。操作できなくなったほうが負け。どちらが勝つか。
(ARC137C)
単調性より、\(x_N\) が大きいほど先手が有利。戦略盗みにより、\(x_N-x_{N-1} \geq 2\) ならば先手の勝ち。さもなくば、\(x_N-x_{N-1} =1\) を保ちながら遷移するしかないので、最適手は \(O(N)\) でシミュレートできる。
- 先手は好きな頂点を1つ選び書き込まれた数字を零にする。
- 後手は子に駒を移動する。葉に移動した場合はゲーム終了。葉でもなくとも、後手の意思で終了にできる。
ゲーム終了時点で駒がある頂点に書き込まれた数字が得点になる。先手は得点を最小化、後手は得点を最大化したい。何点になるか。(ABC246G)
得点はX点以上か?について二分探索して、後退解析。取り除ける頂点が多いほど先手は有利なので、dp[v] := (頂点 v の部分木でゲームをしたとき得点を X 未満にするには、予め何個の頂点の得点を零にしておく必要があるか) について dp ができる。
\(a_1, a_2, \ldots, a_N\) 個の石からなる山が \(N\) 個ある。Aさんは右端の山から好きな個数の石を取ることができ、Bさんは左端の山から好きな個数の石を取ることができる。交互に操作を行う。操作できなくなったほうが負け。どちらが勝つか。
(AGC048D)
指せる手の単調性より
- \(a_1\) が大きいほど A さんが有利
- \(a_N\) が大きいほど B さんが有利
だから、操作は
- 山から石を一つだけ取る
- 山から石を全て取る
のどちらかであるとしても勝敗は変化しない。
- 残っている山が \(l, \ldots, r\) 番目で、\(l\) 番目の山以外は初期状態と石の個数が同じである。A さん先手で、A さんの勝ちとなる \(a_l\) の最小値 \(f(l, r)\)
- 残っている山が \(l, \ldots, r\) 番目で、\(r\) 番目の山以外は初期状態と石の個数が同じである。B さん先手で、B さんの勝ちとなる \(a_r\) の最小値 \(g(l, r)\)
\(f(l, r-1), g(l+1, r)\) から \(f(l, r), g(l, r)\) が \(O(1)\) で求まる。
不変量に着目する
二部グラフ
二部グラフ上のゲームの場合、各部集合が何らかの不変量と関連していることが多い。特に、グリッドグラフが頻出である。
- \((x+y) \bmod 2 = 0\) に置かれた駒の個数 A
- \((x+y) \bmod 2 = 1\) に置かれた駒の個数 B
と置く。(A, B) の勝敗を2次元平面にプロットすると、のようになる。青マスが勝ち。端のはてなのマスは、はてな同士を行き来することで勝敗が決まらないように思えるが、最終的に \(x = y\) 方向に移動せざるを得なくなることから、外側のはてなの方が勝ちになる。よって、\(A – B \neq 0 \pmod 3 \Leftrightarrow \) 先手必勝。
- s, t の点連結度が1のとき先手の勝ち。
- s, t の点連結度が2のとき、点連結度を1にしたほうが負けなので、その直前では、2つの内素な s-t パスだけになる。二部グラフなので、このときの頂点数はそれまでの操作によらない。従って勝敗も O(1) で分かる。
グリッドグラフ
上手くマッチングを作る。
偶奇
偶奇が不変量に関連していることがある。
- すべての要素を 1 減らす。全ての要素が正整数である場合のみこの操作ができる。
- 正整数を一つ選び、1 減らす。
操作ができなくなった方が負け。どちらが勝つか O(1) で求めよ。
(KUPC2020春E)
(最小値、総和)の偶奇の遷移は下図のようになる。\(N\) の偶奇によらず二部グラフになる。最小値 0 だと、全要素を 1 減らす遷移ができないが、可能な遷移は部分グラフであるので、なお二部グラフである。
gcd で割らなければ、\(\sum (A_i-1)\) 回操作ができる。A の要素に奇数が含まれていれば gcd は奇数で、\(A_i, A_i/\mathrm{gcd}(A)\) の偶奇は同じ。従って、\(\sum (A_i-1)\) が不変。A の要素に奇数が一つ以上含まれていれば、奇数を二つ以上にして相手に渡せる。従って、 gcd(A) = 1 より奇数は必ず含まれているので \(\sum (A_i-1) = 1 \pmod 2\) ならば先手の勝ち。A に奇数が一つだけ含まれていて、\(\sum (A_i-1) = 0 \pmod 2\) ならば、その奇数から 1 引いて gcd で割ってから相手に渡すことになる。このような操作は \(O(\log(\max(A))\) 回しか行われない。
- 山を2つに分割する。
- 各山から石を一つ取り除く。ただし、各山に2つ以上の石がなくてはならない。
操作できなくなったほうが負け。どちらが勝つか。(yukicoder1852)
(i) : \(\min(a)=1\) のとき、 \(S := \sum (a_i-1)=1 \Leftrightarrow \) 先手の勝ち。
(ii) : \(\min(a) > 1\) のとき、\(a_1\) を \(1, a_1-1\) に分割すると、(i) の \(S \leftarrow S-1\) の場合に帰着される。従って、\(S\) が奇数なら先手の勝ち。さもなくば、\(\forall i, a_i \leftarrow a_i-1\) の操作しか先手はできず、後手に \(S \leftarrow S-N\) の状態で渡される。\(N\) が奇数なら、先手の負け。\(N\) が偶数なら、\(\min(a)\) の偶奇で勝敗が決する。
連結になる直前の連結成分の大きさが \(k, n-k\) とすると、追加された辺の本数は \(n(n-1)/2-|E|-k(n-k)\) である。従って \(k(n-k)\) の偶奇によって勝敗が決まることが分かる。\(n\) が奇数ならば、\(k(n-k) \bmod 2\) は \(k\) に依らず決定する。従って、以降は \(n\) が偶数の場合のみを考える。先手は、偶成分が2つの状態を作ると勝ち、あるいは、奇成分が2つの状態を作ると勝ちのどちらかに排反でなる。次の三つの数をパラメータにして考察する。
- 偶成分の個数
- 奇成分の個数
- 連結成分の個数を変えずに追加できる辺の個数の偶奇
この三つの数は、各操作によって次のように変化する。
- 偶成分と偶成分をマージ \((-1, 0, 1)\)
- 偶成分と奇成分をマージ \((0, -1, 1)\)
- 奇成分と奇成分をマージ \((1, -2, 0)\)
- 連結成分内で辺を追加 \((0, 0, 1)\)
ところで$$(-1, 0, 1) + (1, -2, 0) = (0, -2, 1)$$だから
偶成分2つより、奇成分2つの方が作りにくい。先手が偶成分2つの状態を作りたいとする。奇成分は常に偶数個あるから、偶成分が一つでもある状態で回ってこれば、偶成分が2つ以上にして相手に渡せる。相手は偶成分を高々一つしか減らせないので、これは勝ちである。奇成分しかない場合を考える。相手に偶成分を作ってもらうために、奇成分のみの状態で手番を相手に渡す必要がある。つまり、連結成分内の辺の追加で手番を入れ替えなければならない。頑張って場合分け。
グラフGが与えられる。偶点を交互に取り除く。行動できなくなったほうが負け。どちらが勝つか。
偶点の偶奇 \(a\) は \(|V|-\sum_v d(v) = |V|-2|E|\) に等しい。偶点 \(v\) を除くと \(a \leftarrow a-1-2d(v) \bmod 2\) となるから、\(a\) の偶奇で勝敗が決まる。
グラフ理論
後手が勝つならば、先手はその戦略を採用することで、先後どちらも2つの全域木が取れる。逆にこの時、後手が勝てることは、木がマトロイドであることと基交換定理から従う。
Nim
一山崩し
\(\mathrm{sub}(S)\) あるいは \(\mathrm{sub}(s_1, s_2, \ldots, s_n)\)
と書くことにする。また、\(S\) が有限集合の時、\(\mathrm{allbut}(S)=\mathrm{sub}(\mathbb{N} \setminus S)\) と書く。
\(\forall, x \in S, \exists y ∈ S, x + y = C\) ならば周期 \(C\) と分かる。また、\(\{1, 2, \ldots, k\} \subseteq S\) かつ \(\forall x ∈ S \setminus \{1, 2, \ldots, k\}, (k + 1) | x\) ならば、\(N = 0 \pmod {k + 1}\) ⇔ 後手勝ち である。
\(\#S \leq 2\) の時の勝敗は?
\(S = \{a, b\}\) と置く。\(a < b\) としてよい。\(N \leftarrow N \bmod {(a+b)}\) としても勝敗は変わらない。\(N < b\) かつ \(\lfloor N/a \rfloor =1 \pmod 2\) または \(b \leq N < a + b\) のとき先手勝ち。
\(S = \{s_1, s_2, \ldots, s_n\}_{<}\) とする。\(s_{i+1} \leq s_i + s_1\) とするとニム列は \(0^{s_1}1^{s_2-s_1}2^{s_3-s_2-s_1} \cdots\) のようになって、周期はある \(i\) を用いて \(s_1+s_i\) となる。
\(\mathrm{sub}(S)\) のニム列が純周期的で周期 \(p\) のとき、\(\mathrm{sub}(S\cup \{mp\}) \) \((m \geq 0)\) と同じニム列を持つ。
ニム列はsubは周期的、allbutは算術周期的になる。
\(2s_n < b\) のとき \(G=\mathrm{allbut}(s_1, s_2, \ldots, s_n)\) と \(H=\mathrm{allbut}(s_1, s_2, \ldots, s_n, b)\) のニム列は等しい。
帰納法で示す。\(n < b\) ならば明らかに\(\mathcal{G}_H(n)=\mathcal{G}_G(n)\) である。\(n < k\) で成り立つとする。\(\mathcal{G}_G(k) \neq \mathcal{G}_H(k)\) ならば \(\mathcal{G}_H(n-b) = g_H(n)\) である。
帰納法の仮定より
\begin{align}
\mathcal{G}_G(n-b) \leq \mathcal{G}_G(n-b+s) \\
\Leftrightarrow \mathcal{G}_H(n-b) \leq \mathcal{G}_H(n-b+s) \\
\end{align}
である。
\(n-b < n-b+s_n < n-s_n\) より \(n-b+s_n\) は \(H\) の選択肢であるから、\(\mathcal{G}_H(n-b) < \mathcal{G}_H(n-b+s)\) であるが、これは \(x \neq n-b, x < n-s_n\) で \(\mathcal{G}_H(x) = \mathcal{G}_H(n-b)\) の存在をしているので矛盾。
\(ax+by > 0\) となる格子点の集合 \(U\) を考える。sub(a, b) は \(N = ax + by\) となる格子点 \((x, y)\) から格子点 \((x-1, y), (x, y-1) \in U\) のどちらかに移動を繰り返すゲームだともいえる(ARC144F)。
二山崩し
現在の石の個数 \(n\) を固定すると、直前に相手が取った石の個数 \(x\) が大きいほど勝ちやすい。\(n\) をフィボナッチ符号で表したときの最小のフィボナッチ数 \(F_k\) が \(x \leq F_k\) なら勝ちである。\(n-F_k\) を相手に渡す。\(n’=n-F_k\neq 0\) とする。相手は \(y\) 個の石を取り除いたとする。 \(n’\) の最小のフィボナッチ数を \(F_l\) (\(l < k\)) としたとき、 \(F_{l}-y\) のフィボナッチ符号における最小のフィボナッチ数が \(2y\) 以下であることを言えばよい。それは次のような計算により分かる。\begin{align}
101010 + 1 &= 101011 \\
&= 101100 \\
&= 110000 \\
&= 1000000 \\
\end{align}
\begin{align}
10101001 + 10 &= 10101011 \\
&= 10101100\\
&= 10110000\\
&= 11000000\\
&= 100000000\\
\end{align}従って、\(n\) がフィボナッチ数ならば後手の勝ち、さもなくば、先手の勝ち。
\((a, b)\) の遷移をマス目上に書いてみると、\begin{align} x_i &= \mathrm{mex}\{x_j, y_j\}\\ y_i &= x_i + i\end{align} によって定まる二つの山 \((x_i, y_i), (y_i, x_i)\) が負けであることが分かる。
レイリーの定理より、\(\alpha, \beta\) が無理数で \(1 / \alpha + 1 / \beta = 1\) ならば \(\{ \lfloor i\alpha \rfloor : i \in \mathbb{N}\}, \{\lfloor i\beta \rfloor : i \in \mathbb{N}\}\) は \(\mathbb N\) の分割である。特に黄金比 \(\phi\) は \(1 / \phi + 1 / \phi^2 = 1\) を満たし、\(x_i = \lfloor i\phi \rfloor, y_i = \lfloor i \phi^2\rfloor\) となる。確かに、\begin{align} & i + x_i = \lfloor i (\phi +1)\rfloor = \lfloor i \phi^2\rfloor = y_i \\ &\lfloor n\phi \rfloor = \mathrm{mex}\{\lfloor i\phi \rfloor, \lfloor i \phi^2 \rfloor : i < n\}\end{align} となっている。
(レイリーの定理の証明)無理数 \(\alpha, \beta\) が \(1 / \alpha + 1 / \beta = 1\) を満たすとする。\(A := \{i\alpha : i \in \mathbb{N}\}, B := \{i\beta : i \in \mathbb{N}\}\) と置く。\(i \alpha = j \beta \Leftrightarrow \alpha / \beta = j / i\) は、左辺 \(\alpha / \beta = \alpha-1\) が無理数、右辺 \(j/i\) が有理数なので、起こりえない。従って、\(A, B\) は交わらない。\(f(x) = \#\{y \leq x : y \in A \cup B\}\) とすると、\(f:A\cup B \rightarrow \mathbb{N}\) の全単射である。\(f(i\alpha) = \lfloor i \alpha \rfloor, f(i\beta) = \lfloor i\beta \rfloor \) なので、\(\{\lfloor i \alpha \rfloor : i \in \mathbb{N}\}\) と \(\{\lfloor i \beta \rfloor : i \in \mathbb{N}\}\) は相補的である。
\(\mathbb{N}\) の分割 \(A = \{a_1, a_2, \ldots,\}_<, B = \{b_1, b_2, \ldots, \}_<\) が \(b_i = a_i + i, a_1 = 1\) を満たすならば、そのような数列は明らかに一通りしかなく、レイリーの定理はその表現を与える。一方、フィボナッチ進法を使って、そのような集合を別の方法で表現することができる。\(x \leq y\) の先手負けの状態 \((x, y)\) のゼッケンドルフの表現は次の様になっている。
i | x | y | i のゼッケンドルフの表現 | x のゼッケンドルフの表現 | y のゼッケンドルフの表現 |
---|---|---|---|---|---|
0 | 0 | 0 | 00000000 | 00000000 | 000000000 |
1 | 1 | 2 | 00000010 | 00000010 | 000000100 |
2 | 3 | 5 | 00000100 | 00001000 | 000010000 |
3 | 4 | 7 | 00001000 | 00001010 | 000010100 |
4 | 6 | 10 | 00001010 | 00010010 | 000100100 |
5 | 8 | 13 | 00010000 | 00100000 | 001000000 |
6 | 9 | 15 | 00010010 | 00100010 | 001000100 |
7 | 11 | 18 | 00010100 | 00101000 | 001010000 |
8 | 12 | 20 | 00100000 | 00101010 | 001010100 |
9 | 14 | 23 | 00100010 | 01000010 | 010000100 |
10 | 16 | 26 | 00100100 | 01001000 | 010010000 |
11 | 17 | 28 | 00101000 | 01001010 | 010010100 |
\(\mathcal{P}\) ポジションは \((0, 0)\) または \((\overleftarrow{x}, x)\) の形をしている。また、\(x\) の正規ゼッケンドルフ表現の LSB は偶数の位置に、\(\overleftarrow{x}\) の LSB は奇数の位置にある。LSB の偶奇性と、\(\overleftarrow{x}, x\) は一方からもう一方が定まることから、\((\overleftarrow{x}-i,x), (\overleftarrow{x},x-i), \) は \(\mathcal{P}\) にならない。
\(x = \overrightarrow x + \overrightarrow{\overrightarrow{x}}\) なので、\begin{align}
& \overleftarrow x-x \\
={}& (y + \overrightarrow x)-x \\
={}& \overrightarrow{x}
\end{align}
である。\(\overrightarrow{x}\) は LSB が奇数の位置にあるゼッケンドルフ表現で表せる。各正整数 \(n\) に対して、このような表現はただ一つ存在し、第二正規ゼッケンドルフ表現と呼ぶ。第二正規ゼッケンドルフ表現は \(n-1\) の正規ゼッケンドルフ表現に \(1\) を足せば得られる。例えば、\(1010 + 1 = 10000\) である。一意性は、第二正規ゼッケンドルフ表現 \(1\) を引くと \(n-1\) の正規ゼッケンドルフ表現になり、正規ゼッケンドルフ表現が一意であることから従う。以上から、\((\overleftarrow x, x)\) が \(\mathcal P\) ならば \((\overleftarrow x-i, x-i)\) は \(\mathcal{P}\) でない。
\((y, x) \) (\(y \geq x\)) が \(\mathcal{N}\) だとする。(i) \(x\) の LSB が偶数の場合:\(y \geq \overleftarrow{x}\) ならば \((y-i, x)\) で \(\mathcal{P}\) に遷移できる。そうでないとする。\(\overrightarrow{d}:=y-x < \overleftarrow{x}-x\) なので、\((\overleftarrow d, d) = (y-i, x-i)\) となる \(i\) が存在して \(\mathcal{P}\) に遷移できる。ただし、\(\overrightarrow d\) は第二正規表現とする。(ii) \(x\) の LSB が奇数の場合:\(x\) のLSBは1番目にはならないことに注意。\(y \geq x \geq \overrightarrow {x}\) なので \((y-i, x)\) で \(\mathcal{P}\) に遷移できる。
\(k = \lfloor i \phi \rfloor \) と置くと、\(i\phi < k + 1 \Leftrightarrow i – 1/\phi < k\) なので \(\lfloor \lfloor i\phi \rfloor /\phi \rfloor = i – 1\) である。同様に \(k = \lfloor i\phi^2 \rfloor \) と置くと \begin{align} k \leq &i \phi^2 < k + 1 \\ \Leftrightarrow i \phi – 1 / \phi < & k/\phi \leq i \phi \\ \Leftrightarrow i+i / \phi -1/\phi < &k/\phi \leq i + i / \phi \end{align} なので \(\lfloor\lfloor i \phi^2 \rfloor/\phi \rfloor = \lfloor i\phi \rfloor \) である。それぞれのフィボナッチ進法を考えることで、ニム数が求まる。
複数山崩し
真似っこ戦略により、\(x_i \leftarrow x_i \bmod (a+b)\) としても結果は変わらない。全ての要素が \(a\) 未満ならば先手の負け。さもなくば、先手は可能な限り多くの山から \(a\) 個ずつ石を取り去って、相手に渡す。このとき、\(b\) 個以上の山があれば後手の勝ち、さもなくば先手の勝ち。
非不偏ゲーム
左右のそれぞれが先手のときの勝敗を個別に分析する必要はない。
- 左右のうち、右が先手の時の勝敗が完全に分かっている。
- そのことから、左が先手のときの最善の一手目が得られる。
このとき、左が先手の時の勝敗が完全に得られる。(Xならば確実に勝つ/負ける)という条件が存在する方が条件が簡単になりやすく、そちらを主にして勝敗を分析するとよい。
Nを書いてはいけない。また、すでに書かれた数に対して、互いに素な数や、約数・倍数である数は書けない。どちらが勝つか。(Saint Petersburg 1997)
まずAは相異なる2つの素数の積 \(pq\) を書く。Bは \(p\) か \(q\) の倍数であって、\(pq\) の倍数でないものを書く。 \(pk\) を書いたとする。Aは常に続いて \(qk\) が書ける。従って先手の勝ち。
各行について、B は k 個のマスを選び、そのどれかを黒くすることができる。これは、A が書いたマスの行について、応手することでできる。各行 k 個のマスを非連結になるように選べるので、Aの負け。
\(5 \times 5\) のマスで、A, B は交互に白と黒の駒を置く。Aは白の駒が5個並んだ列・行・対角の何れかが作れると勝ち、さもなくば負けである。どちらが勝つか。
下のようなペアが作れるので後手の勝ち。
x626y
5ccd3
1bod1
5baa3
y424x
1行目と2行目、3行目と4行目の上下に隣接するマスをペアにすれば良い。
書き込める場所が全てS..Sの形になると何を書き込んでもSO.かS.Sができて、相手がSOSを作れるので負け。負けるときは全てこのパターンである。先手は最初の二手で S..S の形を少なくとも一箇所作ることができ、マスの偶奇性も合わせると先手の勝ち。
\(n\) が偶数とする。偶数 \(n\) を持ったとき、\(\lfloor(n+1)/2\rfloor\) を渡すと負けるとする。
\(\lfloor(n-1)+1)/2\rfloor = \lfloor (n+1)/2\rfloor\)
であるから、 \(n-1\) に対して、相手の応手は \((n-1)-1\) である。\(n=2\) のときに勝ちであるから帰納法により、任意の偶数 \(n\) で勝ちである。
後退解析。偶奇性よりNが奇数なら先手の勝ち。Nが奇数とする。\(N = 4k\) のとき、\[2k+1, 4k]\) には勝ちと負けが交互に現れる。\(i \in [k+1, 2k]\) は \(2i\) に遷移できるので勝ち。\(i \in [1, k]\) は \([k+1, 2k]\) に遷移しても仕方がないので、ここでゲームが閉じている。従って、\(4k, k\) のゲームの勝敗が一致する。\(N = 4k+1\) のとき、\([2k+1, 4k+1]\) には負けと勝ちが交互に現れる。\(i \in [k+1, 2k]\) は \(2i\) に遷移できるので勝ち。\(i \in [1, k]\) は \([k+1, 2k]\) に遷移しても仕方がないので、ここでゲームが閉じている。従って、\(4k+1, k\) のゲームの勝敗が一致する。
2つの山の個数をそれぞれ \(a, b\) と置くと \(|a-b| \geq 2\) が先手が勝つための条件。
ヒルベルトの基底定理
-
- Bはある整数 \(1 \leq i \leq 59\) を選び、1個目からi個目までの箱の集合Xとi+1個目から60個目までの箱の集合Yに分割する。AはXの各箱から一つずつ石を取り去り、Yの各箱に入れるか、その逆を行う。
途中でからの箱ができるとAの負け。さもなくばAの勝ち。Aが勝つための条件を求めよ。
(2019 ISL C7)
\(n = 1, 2 \pmod 4\) のとき B, \(n = 0, 3 \pmod 4\) のとき A の勝ち。
- \(n \geq 2^k\)ならばBが勝つことを示せ
- 任意の十分大きいkに対して、\(n \geq 1.99^k\) であって、Bが勝てるnが存在することを示せ。
(IMO2012)
\(\mathcal{G}(n) = \begin{eqnarray}
\begin{cases}
0 &(n = 0) \\
1 + \lfloor \log_2(n) \rfloor &(\text{otherwise})\\
\end{cases}
\end{eqnarray}\)
\(\mathcal G(n) = \mathrm{mex}_{i + j < n}\ (\mathcal G(i) \oplus \mathcal G(j))\) のとき、\(\mathcal G(i) \oplus \mathcal G(j) \leq \mathcal G(i) + \mathcal G(j)\) なので帰納法より \(\mathcal G(n) \leq n \) が成り立つ(ABC278G)。
\(\mathcal G(n)=\begin{cases}
0 & (n = 0) \\
0 & (n\text{ が偶数}) \\
1 & (n\text{ が奇数})
\end{cases}\)
\(\mathcal G(2^{k+1}x + 2^k) = x\)。\(x / 2 < y < x\) には \(\mathcal G(2^{k+1}y + 2^k) = y\) で遷移可能。\(0 \leq y \leq x / 2\) への遷移は、\(x, y\) の辞書順比較で場合分けをすると、存在が分かる。\(n=2^k\) のとき \(\mathcal{P}\) である。
石を右側から二つずつペアにし、ペアにした石の座標の差を石の個数にするようなニムになる。
取り除けるときの勝敗(Moore’s nim)
各山の個数を2進展開して、各桁について和を取ったとき、すべての和がkの倍数か否か。
\(\mathcal G(a, b)=\nu_2( (a \lor b) + 1)\)
\((a+1)\oplus(b+1)\oplus(c+1)\)がP局面
a, bが最初に相異なる桁eを用いて \((a|b)=2^e-1\) と定義する。ただし、\(a=b\)すなわち\(e=\infty\)のときは-1とする。\(n_1, n_2, \ldots, n_k\) のニム数は \(\sum^\oplus n_i \oplus \sum_{i < j}^\oplus (n_i|n_j)\)になる。
ニムの代数構造
足し算は\(a + b = \mathrm{mex}_{a’ < a\\ b’ < b} (a’ + b, a + b’) = a\ \mathrm{xor}\ b\) により定義する。
これは、\(a \neq a’\ \Rightarrow a + b \neq a’ + b\) を満たす最も簡単な数を再帰的に定義している。同様に、\(a \neq a’\land b \neq b’ \Rightarrow (a + a’)(b + b’) \neq 0\) となってほしい。分配法則で \(ab = ab’+a’b+a’b’\) とすると、$$ab = \mathrm{mex}_{a < a’\\ b < b’}(ab’+a’b+a’b’)$$ が定義になりそうである。実際、このように定めると、体になる。
次の計算により、$0, 1$ が零元と単位元になっている。
\begin{align}
a0 &= \mathrm{mex}(\emptyset) = 0 \\
a1 &= \mathrm{mex}_{a’ < a}(a0+a’1+a’0)\\
&=\mathrm{mex}_{a’ < a}(a’)\\
&=a\\
\end{align}
交換法則 \(ab = ba\) は定義から明らか。
\(a \neq 0\) かつ \(b \neq 0\) のとき \(a’=b’=0\) とすると \(a’b+b’a+a’b’=0\) なので \(ab \neq 0\) である。言い換えると、\(ab = 0 \Leftrightarrow a = 0 \lor b = 0\) である。\(a’b+ab’+a’b’=ab \Leftrightarrow (a-a’)(b-b’)=0\) だから
\(\mathrm{mex}_{a’ < a \\ b’ < b}(a’b+b’a+a’b’)=\mathrm{mex}_{a’ \neq a \\ b’ \neq b}(a’b+b’a+a’b’)\) である。この事実を交換法則と分配法則の証明に使う。
\begin{align}
a(bc) &
= \mathrm{mex}_{a’ \neq a \\ b’ \neq b \\c’ \neq c} (a’bc+a(b’c+bc’)+a'(b’c+bc’)) \\
&=\mathrm{mex}_{a \neq a \\ b’ \neq b \\c’ \neq c} ((a’b+ab’)c+abc’+(a’b+ab’)c’) \\\\
&= a(bc)
\end{align}が得られる。
足し算は\(a + b = \mathrm{mex}_{a’ < a\\ b’ < b} (a’ + b, a + b’) = a\ \mathrm{xor}\ b\) により定義する。
これは、\(a \neq a’\ \Rightarrow a + b \neq a’ + b\) を満たす最も簡単な数を再帰的に定義している。同様に、\(a \neq a’\land b \neq b’ \Rightarrow (a – a’)(b – b’) \neq 0\) となってほしい。分配法則で \(ab \neq ab’+a’b+a’b’\) とすると、$$ab = \mathrm{mex}_{a’ < a\\ b’ < b}(ab’+a’b+a’b’)$$ が定義になりそうである。実際、このように定めると、体になる。
次の計算により、\(0, 1\) が零元と単位元になっている。
\begin{align}
a0 &= \mathrm{mex}(\emptyset) = 0 \\
a1 &= \mathrm{mex}_{a’ < a}(a0+a’1+a’0)\\
&=\mathrm{mex}_{a’ < a}(a’)\\
&=a\\
\end{align}
交換法則 \(ab = ba\) は定義から明らか。
\(a \neq 0\) かつ \(b \neq 0\) のとき \(a’=b’=0\) とすると \(a’b+b’a+a’b’=0\) なので \(ab \neq 0\) である。言い換えると、\(ab = 0 \Leftrightarrow a = 0 \lor b = 0\) である。分配法則は \(0\) が含まれるときは明らか。それ以外の場合は、帰納法により、
\begin{align}
(a+b)c &= \mathrm{mex}_{a \neq a’\\ b \neq b’ \\ c \neq c’}((a’+b)c+(a+b)c’+(a’+b)c’, (a+b’)c+(a+b’)c’+(a+b’)c’)\\
&= \mathrm{mex}_{a \neq a’\\ b \neq b’ \\ c \neq c’}((a’c+ac’+a’c’)+bc, ac+(b’c+bc’+b’c’)) \\
&= ac+bc
\end{align}となる。\(a’b+ab’+a’b’=ab \Leftrightarrow (a-a’)(b-b’)=0\) だから
\(\mathrm{mex}_{a’ < a \\ b’ < b}(a’b+b’a+a’b’)=\mathrm{mex}_{a’ \neq a \\ b’ \neq b}(a’b+b’a+a’b’)\) である。\(1\) が含まれるときは交換法則は明らか。それ以外の場合は、帰納法により次の様に示す。
\begin{align}
a(bc) &
= \mathrm{mex}_{a’ \neq a \\ b’ \neq b \\c’ \neq c} (a’bc+a(b’c+bc’)+a'(b’c+bc’)) \\
&=\mathrm{mex}_{a \neq a \\ b’ \neq b \\c’ \neq c} ((a’b+ab’)c+abc’+(a’b+ab’)c’) \\\\
&= a(bc)
\end{align}が得られる。
通常の足し算・掛け算は(齟齬がありそうな場所だけ)\(\oplus, \otimes\) で表す。
\(n = 2^{2^k}, \mathcal{P}_n = \{0, 1, \ldots, n – 1\}\) と置く。
- \(\mathcal{P}_n\) は掛け算について閉じている。
- \(\mathcal{P}_n\) は体をなす。
- \(n^2 = n+n/2 = 2^{2^k}+2^{2^{k-1}}\)
- \(\mathrm{msb}(a) = \mathrm{msb}(a^2)\)
- \(\{a^2 : a \in \mathcal{P}_n\} = \mathcal{P}_n\)
- \(\{a^2 + a: a \in \mathcal{P}_n\} = \mathcal{P}_{n/2}\)
- \(a < n\) ならば \(an = a \otimes n\)
\(\mathcal{P}_1 = \{0\}\) が掛け算について閉じているのは明らか。\(r = 2^{2^{k-1}} = \sqrt{n}\) とする。\(\mathcal{P}_r\) が掛け算について閉じていると仮定する。
\begin{align}
(a \otimes r \oplus b)(c \otimes r \oplus d) &= (ar + b)( cn+d ) \\
&= acr^2+(ad+bc)r+bd \\
&= acr^2+(ad+bc)r+bd \\
&=ac(r+r/2)+(ad+bc)r+bd \\
&=acr+ac(r/2)+adr+bcr+bd \\
&=(ac) \otimes r + ac(r/2) + (ad) \otimes r + (bc) \otimes r +bd \\
\end{align}
\(5\) つの項全てが \(r^2 = n\) 未満なので、\(\mathcal{P}_n\) は掛け算について閉じている。掛け算と足し算に閉じているので有限な環をなす。また、零因子が存在しないので逆元が存在して、体になる。
\(\mathrm{msb}(a^2) = \mathrm{msb}(a)\) は
$$ (a \otimes r \oplus b)^2 = a^2 \otimes r + a^2(r/2)+b^2 $$
より帰納法から従う。
\(a^2 = b^2 \Leftrightarrow (a – b)(a + b) = 0 \Leftrightarrow a = b\) なので、\(\{a^2 : a \in \mathcal{P}_n\} = \mathcal{P}_n\) である。\(\mathrm{msb}(a^2) = \mathrm{msb}(a)\) より \(a^2+a \in \mathcal{P}_{n/2}\) である。 \(a^2 + a = b^2 + b \Leftrightarrow (a+b+1)(a-b)=0 \Leftrightarrow a = b, b+1\) であるから、\(\{a+a^2:a\in\mathcal{P}_n\} = \mathcal{P}_{n/2}\) である。
$$an = \mathrm{mex}(a’n+an’+a’n’)=\mathrm{mex}(a’n+(a+a’)n’)$$
\(a’\) を固定して、\(n’\) を動かす。
\(\mathcal{P}_n\) が体であったから、\(\{(a+a’)n’ : n’ \in \mathcal{P}_n\} = \mathcal{P}_n\) である。従って、mex の中身は \(a’ \otimes n \leq i < (a’\oplus 1) \otimes n\) の任意の数を取れる。\(a \otimes n\) は取れないので、\(an = a \otimes n\)。
$$n^2 = \mathrm{mex}_{a < n \\ b < n}(an+nb+ab)$$
\(a=b\) のとき、除かれる数は \(a^2\) となる。\(\{a^2 : a \in \mathcal{P}_n\}=\mathcal{P}_n\) であった。\(b=a + 1\) とすると、除かれる数は \(an+(a+1)n+a(a+1)=n+a(a+1)\) である。\(\{a^2+a : a \in \mathcal{P}_n\} = \mathcal{P}_{n/2}\) であったから、\(n+\mathcal{P}_{n/2}\) が除かれる。以上より、\(\mathcal{P}_n \cup \{n + \mathcal{P}_{n/2}\} = \mathcal{P}_{n+n/2}\) が除かれる。\(n^2+n/2\) が除かれることはないので、\(n^2 = n^2 + n / 2\) である。
\(a \neq b\) かつ \(b \neq a + 1\) のとき、\(a+b > 1\) である。このとき、
$$n(a+b) = n \otimes (a + b) \geq 2n$$
だから \(n + n/2\) が除かれることはない。
排他的論理和が 0 になってはいけない。逆形のときの勝敗を求めよ。(ARC131C)
yuki1613)
駒の有無を2進数の0/1に対応付けると、$$\mathcal{G}(n)=\mathrm{mex}\mathcal{G}(n-2^i)$$ である。3の倍数のペアが作れるので、周期3になる。
奇数番目の山の石の移動は打ち消し可能なので、偶数番目の山の個数の総和がニム数になる。
n が k の倍数のとき \(\mathcal{G}(n) = n / k\) さもなくば \(\mathcal{G}(n) = \mathcal{G}(n – \lfloor n / k \rfloor – 1)\) である。n – n / k = (1-1/k)n なので、O(klog(n)) . \(\lfloor n / k\) が同じ部分をまとめて処理すると O(n / k). よって\(O(\sqrt{n \log(n)})\)
根に複数の子が接続している場合は、各辺ごとに新たに根を作って、それらのニム数のXORを取ればよい。子が一つだけの場合は、その子を根とする部分木のニム数に1足した値が元の木のニム数になる。
赤の辺を1, 青の辺を1とする。例えば、根の辺から順に左から右に書くと
$$111001110$$
のようになったとする。すると、ゲームの値は
$$2+.0011101$$
となる(小数部分は2進表記)。先頭の (1 の個数) – 1 が整数部分、小数部分はそれより後ろの部分の最後に 1 を付け足した値になる。同じ値だが、
\begin{align}
1+1+1-\frac{1}{2}-\frac{1}{4}+\frac{1}{8}+\frac{1}{16}+\frac{1}{32}-\frac{1}{64}
\end{align}という表示もある。帰納法より、一番後ろの辺を削除するのが最善手で、
$$\{2+.00111\ |\ 2+.001111\} = 2+.0011101$$
から従う。
根の子の数が2個以上ある場合はそれぞれに対して新たに根を作った場合の数の和を取ればよい。従って根の子が一つだけの場合のみ考えればよい。根と子を繋ぐ辺が青で、子の部分木のゲームが根付きパスの
$$111001110$$
と同一視できるとする(この値を \(x\) と置く)。すると先頭に 0 を付け足すと
$$0111001110$$となる(この値を \(x’\) と置く)。
\begin{align}
x’ &= -1 + (x – k) / 2^k + (1 / 2 + 1 / 4 + \cdots + 1 / 2^k) \\
&= (x – k – 1) / 2^k
\end{align}である。\(x’ < 0\) となる最小の \(k\) を選べばよい。
左から \(i\) 番目の駒の位置を \(p_i\)、その駒の色を \(c_i\) (青なら 1 赤なら -1)、その駒より右側にある駒(右端2個が同色なら削除を可能回数繰り返した後)の数を \(r_i\) と置く。\(\sum c_i \frac{p_i}{2^{r_i}}\) がゲームの値になる。例えば、一番左側の青駒( i 番目の駒)を左に一つ移動した場合、ゲームの値が $$\frac{1}{2^{r_1}}+\frac{1}{2^{r_2}}+\cdots+\frac{1}{2^{r_{i-1}}}-\frac{1}{2^{r_i}} = -\frac{1}{2^{r_i}}$$だけ変化する。Aさんはこの手が最適である。Bさんも同様に一番左の赤駒を一つ左に移動するのが最適で \(\frac{1}{2^{r_1}}\) だけ変化する。従って、\(x = \{x + \frac{1}{2^{r_1}}| x – \frac{1}{2^{r_1}}\}\) であることを示せばよい。\(x\) の分母が高々 \(2^{r_1}\) なのでよい。
先手と後手はそれぞれ \([n]\) の多重集合\(\{1^{A_1}, 2^{A_2}, \ldots, N^{A_N}\}, \{1^{B_1}, 2^{B_2}, \ldots, N^{B_N}\}\)が与えられる。手番のプレイヤーは自分の多重集合から元を一つ削除する。次の手番のプレイヤーは同じ元を自分の多重集合から削除するか、何もしないか選択できる。同じ元を自分の多重集合から削除した場合、手番が移る。先に空集合になった方が勝ち(ARC151F)。
少し考えると、\(A_i \leftarrow \min(A_i+1, B_i+1, A_i), B_i \leftarrow \min(A_i+1, B_i+1, B_i)\) としても勝敗は変わらないことが分かる。\(S_A = \{i^A_i : A_i < B_i\}, S_B = \{i^B_i : A_i > B_i\}, S_{=} = \{i^A_i : A_i = B_i\}\) と置く。
- \(S_{=} = 0\) ならば \(S_A > S_B\iff\) 先手勝ち。自分の方が多い元から優先して削除すればよい。
以下 \(S_{=}>0\) とする。
- \(S_A\geq S_B + S_{=}-1\) ならば先手勝ち。先手は \(S_B, S_{=}, S_A\) の順の優先度で要素を選ぶ。後手には \(S_A \geq S_B + S_{=}\) で手番が移る。後手が \(S_A\) を選んだ時だけ応手する。後手が \(S_A\) を選んだときに後手の集合が空になることはない。
- \(S_A+S_{=} \leq S_B\) ならば後手勝ち。後手は先手が \(S_B\) を選んだ時だけ応手する。
以下 \(S_B-S_{=} < S_A < S_B+S_{=}-1\) とする。
- \(S_{B} = 0, S_A > 0\)、(両者とも非空の組の)山が三つ以上のとき先手勝ち。先手は \(S_{=}\) を選ぶ。
- \(S_{A} = 0, S_B > 0\)、(両者とも非空の組の)山が三つ以上のとき後手勝ち。基本的に後手は応手するが、\(S_{B}=0\) のときは、偶奇によって応手するかどうかを決める。
- \(S_{A}=S_{B}=0\) のとき \(S_=\) の種類数を \(n\) と置く。\(n=1\)ならば \(S_{=} =1 \pmod 2 \iff \) 先手勝ち。\(n > 1\) ならば \(S_{=} =n+1 \pmod 2 \iff \) 先手勝ち。\(n \neq 1\) のとき \(S_{=}\) の要素数1の要素を選ぶと負けになるので要素数1を避けながら互いに即応手を繰り返す。また、この結果から、\(n > 1\) のとき、サイズ1の山を \(S_=\) に加えても勝敗は不変である。
Comments