CODE FESTIVAL 2016 Grand Final C - Cheating Nim
問題概要
2人でNimをする。
はじめに 個の山があり、 番目の山には石が 個ある。
ゲームが始まる前に、それぞれの山から石を0個または1個取り除く。
後手が必ず勝つために取り除く石の数の最小値を求めよ。
制約
解法
Nimで後手が勝つためには、 すべての山の石の個数のxorが0でなければならない。
よって、この問題は、「それぞれの山から石を0個または1個取り除いて全体のxorを0にするときの取り除く最小の個数を求める」問題に帰着する。
はじめ、すべての山の石の個数のxorが で、石が 個ある山から石を1個取り除いた時、全体のxorは xor xor になる。
ここで、 xor は と表せるので、全体のxorは xor となる。
つまり、この操作において、全体のxorは下位 ビットのみが変更されることがわかる。
よって、 の上位ビットから順番に見ていき、 の ビット目が1だったら、 xor が となる山から石を1個取り除けばよい。
最終的に が0になれば取り除いた個数を出力し、 が0にならなければ-1を出力する。
より は高々32ビット程度なので、各ビットについて石を取り除く山をで調べても十分間に合う。
Submission #3024566 - CODE FESTIVAL 2016 Grand Final(Parallel)