割と手間取った。
https://atcoder.jp/contests/arc185/tasks/arc185_a
問題
正整数N,Mが与えられる。N<Mである。
ここで2人でゲームを行う。
両人とも初期状態で1~Nが書かれたカードを1枚ずつ持っている。
各自自分のターンでは手持ちのカードを1枚場に出す。その際、両名の出したカードの数値の和がMの倍数になると、最後にカードを出した人の負けとなる。
また、互いに全部のカードを出し終わっても勝敗が決しない場合、先手の勝利となる。
先手後手勝つのはどちらか。
解法
N<Mなので、手持ちのカードが2枚以上あるとき、負けないカードの出し方ができる。
よって、勝負が後手が残り2枚、先手が残り1枚の時である。
この時、後手が勝つには、カードの数値の合計をS、最後に出すカードをbとしたとき、S-bがMの倍数ならよい。
これを達成するには、bが1~Nのいずれかなので、S%Mが1以上N以下なら良いことになる。
int T,N,M; void solve() { int i,j,k,l,r,x,y; string s; cin>>T; while(T--) { cin>>N>>M; ll S=1LL*N*(N+1)/2; if(2*S%M>=1&&2*S%M<=N) { cout<<"Bob"<<endl; } else { cout<<"Alice"<<endl; } } }
解法
これ2・3分で自身もってsubmitできる人すごいな。