バイトの競プロメモ

主に競技プログラミング

B - 石取り大作戦 AtCoder Regular Contest 046

B - 石取り大作戦
問題概略
石がN個あり、先手は1~A個、後手は1~B個取れる。
最後の石を取ったほうが勝ちの場合、最適でどちらが勝つか。

解法
A >=N の時は明らかに先手が勝つ。
それ以外の場合を考える。

A==Bの時を考える。
N %(A+1)!=0 の時Aが勝ち、それ以外の時はBが勝つ。

!=0の時にAが勝つ方法
この時Aは、毎ターン残りがA+1で割けれるような状態で手を終えられる。
(まず最初のターンに残り(A+1)P 個でターンを終えると、相手の任意の手について、残り(A+1)(P-1)個で回せるため)
Aが負けるのは残り1~A個の状態で手を渡した時なので必ず勝てる。

==0の時Bが勝つ方法
Aの任意の手についてA+1で割った余りが0になるように渡す事ができ、上と同じ理由で勝つ

A>Bの時はAが勝つ
Aは全部取れる時意外は1つ取れば良い。
残りB個以内で手を渡すと負けるが、AはB+1個以上取れるためそのような事は起きない。