SRM384 Div2 1000
問題
AlanとBobが2つの山からスティックを交互に取り除くゲームをする.最初はAlanのターンから始まり,各プレイヤーは正確にn^2本のスティックを各山から取り除く.各山から取り除くスティックの本数は同じでなくてよい.(山1から1^2本,山2から3^2本などが可能)
最初にそのようなとり方ができなくなったプレイヤーの負けになる.
それぞれの山にあるスティックの本数がそれぞれsize0,size1で与えられる.
両者が最適にプレイした場合,最短で何ターンでどちらが勝つか.
(勝てる場合は早く勝とうとし,負ける場合は遅く負けようとする)
考え方
同時に取り除いていくが,山同士が独立しているので,山1と山2のターン数の少ないほうを求めればいいことがわかる.なので,山のsize本が最短で何ターンでどちらが勝つかをはんていすればよい.
i本のスティックがある状態で自分のターンになった場合,
- 「最後のスティックをとったら勝ち」=「i=0なら負け」
- あるj本に対して,i-j*j本が負けならば,i本はその本数にすれば必ず勝てる
- 一番ターン数の少なくなる本数を取り除く
- すべてのj本に対して,i-j*j本が勝ちならば,i本は勝つことができないので必ず負ける
- 一番ターン数が多くなる本数を取り除く
というのをDPを使って計算すればよい.
この問題では,ターン数の偶奇によってどちらが勝つかがわかるので,DPはターン数を保持するようにすればよい.
反省
蟻本の上級編の「コインのゲーム1」とほぼ同じ感じ.dpが勝ち負けを保持するかターン数を保持するかの違い.
山が複数存在し,どの山かを選んでその山からだけ取り除く場合の勝敗判定はGrundy数を計算し,(Nimと見なすことができるので)そのXORが0かどうかをみればよい.