公式

P - Game on Colored Tree 解説 by oliverx3


与えられた局面を超現実数を通して二進有理数に変換することで解くことができます。

超現実数とは

正ならば FirstBlue 君が有利、負ならば SecondRed 君が有利、$0$ ならば FirstBlue 君と SecondRed 君は対等として、ゲームの局面を実数で評価することを考えます。この評価値を、そのゲームの値と呼ぶことにします。

ある局面 $G$ から、FirstBlue 君は値がそれぞれ $B_1, B_2, \ldots , B_n\ (B_1 < B_2 < \cdots < B_n)$ である局面に、SecondRed 君は値がそれぞれ $R_1, R_2, \ldots , R_m\ (R_1 < R_2 < \cdots < R_m)$ である局面に遷移可能であるとします。

$G$ の値を $V$ とします。このとき、$V > B_n$ であるべきです。遷移後の局面は、FirstBlue 君が操作可能な辺が減ることになるので、より悪い局面になったといえるからです。同様にして、$V < R_1$ もいえます。

よって $B_n < V < R_1$ がいえました。

簡単のため、ある局面の値を、その局面から FirstBlue 君が遷移可能な局面の値のうち最大のものを $B$、SecondRed 君が遷移可能な局面の値のうち最小のものを $R$ として、$\{B \mid R\}$ と表すことにします。

頂点 $1$ のみの局面は、FirstBlue 君が遷移可能な局面も SecondRed 君が遷移可能な局面もないため、$\{\ \mid \ \}$ とすることにします。また、FirstBlue 君も SecondRed 君も操作できないため、値は $0$ であるべきです。よって、$\{\ \mid \ \} \stackrel{\mathrm{def}}{=} 0$ とします。

$2$ 頂点からなり、それらを結ぶ辺が青色である木の局面を考えます。この局面の値は $\{0\mid \ \}$ です。これは $0$ より大きいです。そこで、$\{0\mid \ \} \stackrel{\mathrm{def}}{=} 1$ とします。一般に、$\forall n \in \mathbb{Z},\ \{n\mid \ \} \stackrel{\mathrm{def}}{=} n+1$ とします。 同様にして、$\forall n \in \mathbb{Z},\ \{\ \mid n\} \stackrel{\mathrm{def}}{=} n-1$ とします。

ここで、図 $1$ の局面の値を考えます。図 $2$ の局面(サンプル $1$ の $2$ 個目のゲームと一緒です)に注目します。この局面は後手必勝、すなわち FirstBlue 君が先手の場合は SecondRed くんの勝ち、SecondRed 君が先手の場合は FirstBlue 君の勝ちであることが実験によりわかります。もとの問題では先手は必ず FirstBlue 君でしたが、ここでは SecondRed 君が先手の場合も考慮していることに注意してください。

図 $2$ の局面の値は、この局面が後手必勝であることを考えると、$0$ であるべきです。

図 $2$ の局面は、図 $3$ の $3$ 個の局面が組み合わさってできたものだと考えることができます。図 $3$ の $3$ つの局面のうち、右の局面の値は $-1$ であり、真ん中と左の局面(図 $1$ の局面と同じです)の値は同じです。

このとき、$\dfrac{1}{2} + \dfrac{1}{2} + (-1) = 0$ より、図 $1$ の局面の値は $\dfrac{1}{2}$ であってほしいです。そして、図 $1$ の局面の値は $\{0\mid 1\}$ と表され、$0 < \dfrac{1}{2} < 1$ が成り立つので、こう定義してよいです。よって $\{0\mid 1\} \stackrel{\mathrm{def}}{=} \dfrac{1}{2}$ とします。

一般化しましょう。ある局面の値 $\{B\mid R\}$ の値を次のように定義します:

  • $\{B\mid R\} \stackrel{\mathrm{def}}{=} B < \dfrac{i}{2^j} < R,\ i \in \mathbb{Z},\ j \in \mathbb{Z_{\geq0}}$ を満たす $\dfrac{i}{2^j}$ のうち、$j$ が最も小さいもののなかで、$|i|$ が最も小さいもの
ここで、$\{B \mid R\}$ の値は一意に定まることが示せます。

上で行った議論と似たような議論により定義される数は、一般に超現実数と呼ばれ、組み合わせゲームを解析する上で典型的な手法です。超現実数は、実数と同じような扱い(四則演算、順序関係など)ができることが知られています。なお、上で行った議論による定義は、一般的な超現実数の定義とは異なる点に注意してください。

簡単のため、ある局面を超現実数を通して二進有理数に変換したとき、その二進有理数をその局面の値と呼ぶことにします。

ある根付き木の局面は、根から出ているそれぞれの辺ごとに別の根を持ってきて、複数のより小さな根付き木の局面に分解することができます。

超現実数の性質より、もとの局面の値は分解後のそれぞれの局面の値の和となります。

よって、根から辺がただ \(1\) 本出ている場合についてのみ考えればよいです。

ここで、以下の定理が成り立ちます:

  • 値が \(x\) である根付き木の根から新たに \(1\) 本の青色の辺を生やし、その辺の端点のうち根ではない方を新たに根と定めた根付き木の値 \(x'\) は、以下の式で求められる:

\[x' = \dfrac{x+k}{2^{k-1}}\]

    ただし、$k$ は $x+k \geq 1$ を満たす最小の正整数
証明

もとの根付き木を $G$ とする。

$G$ の頂点数に関する帰納法で示す。

$f(x) = \dfrac{x+k}{2^{k-1}}$ (ただし、$k$ は $x+k \geq 1$ を満たす最小の正整数)、$x = \{B \mid R\} = \dfrac{a}{2^b}\ (a \in \mathbb{Z},\ b \in \mathbb{Z_{\geq 0}})$ とする。

$G$ が $1$ 頂点のとき、$x' = \{0 \mid \ \} = 1$ であり、$f(x) = f(0) = \dfrac{0+1}{2^{1-1}} = 1$ より成り立つ。

$G$ が $N-1$ 頂点のときに示されたと仮定して、$G$ が $N$ 頂点のときを示す。

$(\mathrm{i})\ b \ne 0$

    $x = \{B \mid R\} = \dfrac{a}{2^b}$ より、
    $B < \dfrac{a}{2^b} < R$
    $b \ne 0$ と超現実数の定義より、
    $\dfrac{a-1}{2^b} \leq B < \dfrac{a}{2^b} < R \leq \dfrac{a+1}{2^b}$
    $f(x)$ は狭義単調増加関数であることから、
    $f\left(\dfrac{a-1}{2^b}\right) \leq f(B) < f\left(\dfrac{a}{2^b}\right) < f(R) \leq f\left(\dfrac{a+1}{2^b}\right)$
    $k$ を $\dfrac{a}{2^b} + k \geq 1$ を満たす最小の正整数と定めると、$b \ne 0$ であることから、
    $\dfrac{\dfrac{a-1}{2^b}+k}{2^{k-1}} \leq \dfrac{B+k}{2^{k-1}} < \dfrac{\dfrac{a}{2^b}+k}{2^{k-1}} < \dfrac{R+k}{2^{k-1}} \leq \dfrac{\dfrac{a+1}{2^b}+k}{2^{k-1}}$
    帰納法の仮定より、$x' = \{f(B) \mid f(R)\}$ であることから、
    $x' = \dfrac{\dfrac{a}{2^b}+k}{2^{k-1}} = f\left(\dfrac{a}{2^b}\right)$

$(\mathrm{ii})\ b = 0$

    $\mathrm{i})\ a = 0$

      $x = \{B \mid R\} = 0$ より、
      $B < 0 < R$
      $f(x)$ は狭義単調増加関数であることから、
      $f(B) < f(0) < f(R)$
      帰納法の仮定より、$0 < f(B) < 1, f(R) > 1, x' = \{f(B) \mid f(R)\}$ であることから、
      $x' = 1 = \dfrac{1+1}{2^{1 - 1}} = f(0)$

    $\mathrm{ii})\ a > 0$

      $x = \{B \mid R\} = a$ より、
      $B < a < R$
      このとき、
      $a-1 \leq B < a < R$
      $f(x)$ は狭義単調増加関数であることから、
      $f(a-1) \leq f(B) < f(a) < f(R)$
      $k$ を $a + k \geq 1$ を満たす最小の正整数と定めると、$a > 0$ より $k = 1$ である。
      $a \leq f(B) < a+1 < f(R)$
      帰納法の仮定より、$x' = \{f(B) \mid f(R)\}$ であることから、
      $x' = a+1 = \dfrac{a + 1}{2^{1 - 1}} = f(a)$

    $\mathrm{iii})\ a < 0$

      $x = \{B \mid R\} = a$ より、
      $B < a < R$
      このとき、
      $B < a < R \leq a+1$
      $f(x)$ は狭義単調増加関数であることから、
      $f(B) < f(a) < f(R) \leq f(a+1)$
      $k$ を $a + k \geq 1$ を満たす最小の正整数と定めると、$k = 1-a$ である。
      $f(B) < \dfrac{1}{2^{k-1}} < f(R) \leq \dfrac{1}{2^{k-2}}$
      帰納法の仮定より、$x' = \{f(B) \mid f(R)\}$ であることから、
      $x' = \dfrac{1}{2^{k-1}} = f(a)$
以上より、示された(証明終)

同様に、以下の定理も成り立ちます:

  • 値が \(x\) である根付き木の根から新たに \(1\) 本の赤色の辺を生やし、その辺の端点のうち根ではない方を新たに根と定めた根付き木の値 \(x'\) は、以下の式で求められる:

\[x' = \dfrac{x-k}{2^{k-1}}\]

    ただし、$k$ は $x-k \leq -1$ を満たす最小の正整数

証明は青色のときと同じようにできるため省略します。

以上の議論より、根から DFS を行いつつ各点を根とした部分木の値を求めることで、木全体の値を \(\Theta (N)\) 時間で求めることができます。よってこの問題を \(\Theta (TN)\) 時間で解くことができました。

なお、\(N \leq 40\) と比較的小さなサイズであること、値は二進有理数であることを踏まえると、値を浮動小数点数でもったときの誤差はあまり気にしなくてよいです。工夫をすることで、値を全て整数としてもつことも可能です。

実際にこの問題を解くときは、

  1. 超現実数と組み合わせゲームの関係を知識としてもっている
  2. 局面を超現実数を用いて二進有理数に変換することを考える
  3. 小さなケースで実験することで、\(f(x)\) を推定する

という手順を踏むことを想定しています。

実装例 (C++ 62 ms)

投稿日時:
最終更新: