Official

E - Modulo Nim Editorial by camypaper


まず \(a\) が与えられたときにどちらが勝つか判定する問題を考えましょう。

\(0\) は勝敗に影響を与えないこと、同じ数が複数あっても勝敗に影響を与えないことから盤面は自然数の集合で表すことができます。

現在の盤面を \(S\) として \(S=\{1\}\) のときと \(S=\{2\}\) のときは明らかに手番のプレイヤーが敗北します。

それ以外の場合を考えましょう。以降、\(\max(S) \geq 3\) を仮定します。

奇数があった場合、\(m=2\) として手を打てば勝利することから \(S\) の要素は全て偶数であることが必要です。 同様に、\(4\) で割って \(2\) あまる数があった場合、\(m=4\) として手を打てば勝利することから \(S\) の要素は全て \(4\) の倍数であることが必要です。

さらに \(m=3\) の場合を考えると以下のどちらかの条件を満たすことが必要なことがわかります。

  • \(S\)\(3\) で割って \(1\) あまる数と \(2\) あまる数の両方を含む
  • \(S\) の要素は全て \(3\) の倍数

前者の場合、敗北する盤面は \(\{4,8\}\) 以外にはありません。それ以外の場合は \(m=12\) として手を打てば勝利できます。

後者の場合は \(S\) の要素は全て \(12\) の倍数である必要があります。\(a_i \leq 200\) より、この問題の制約下で考慮する必要のある盤面は \(2^{\lfloor \frac{200}{12} \rfloor}\) 個程度しかないことがわかります。

考慮すべき状態が少ないのでメモ化再帰などを用いて実際に勝敗を求め、手番のプレイヤーが敗北するような \(S\) を全て列挙することができます。

さて、元の問題に戻りましょう。 今までの考察から先手太郎君が負けるのはかなり限られた場合であることがわかりました。先手太郎君が敗北する盤面の個数を bitDP などにより求めればよいです。

posted:
last update: