kmjp's blog

競技プログラミング参加記です

AtCoder ARC #185 : A - mod M Game 2

割と手間取った。
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できる人すごいな。