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