AtCoder Regular Contest 131 C 問題 Zero XOR
問題
提出解答
問題の概要
重複がない正の整数の列 があり, 以下のゲームを行う. ただし, 正の整数の列 に対して, で, の全ての要素における XOR とする.
- 先手から次の行動を交互に行う.
- から1要素取り除く. そのとき, ならば, その人の勝ちでゲームを終了する.
後手が勝利のために最善に行動する場合, 先手は勝てるか?
制約
解法
この問題の本質は, 以下の事実である.
が奇数ならば, どんな に対しても, 先手必勝である.
- のとき: 最後の1要素を取ることにより, は空列になり, になる.
- のときに成立するとする. のとき,
- 直接勝てる手が存在する場合, このような手を選択すれば勝利することができる.
- 直接勝てる手が存在しない場合, どのような手を選択したとしても, 後手が直後には勝てないということを示す. 背理法で示す. を消すことを選択するとする. このとき, 背理法の仮定から, を消すことによって勝つことができるとする. このとき, である. このとき, XOR は群で, の各項は互いに異なることから, このような は一意に定まる. よって, この のことを と書くことにする. すると, が成り立つことに注意する. そして, であるから, は によって, 個の直和に分解される. しかし, これは が奇数であることに矛盾する. よって, うまいこと手を選ぶことによって, 後手が直後に勝つことはできず, の場合に帰着される. よって, 帰納法の仮定から, 先手が勝てる.
よって, この事実から, 以下のようにして判定できる.
- が奇数の場合: 必ず勝てる.
- が偶数の場合: 最初の手で勝てない場合, 後手に上の事実を当てはめることにより, 勝てないことが確定してしまう. つまり, となる が存在するかを判定する. なお, これは となる が存在することと同値である.