[ARC185A] mod M Game 2 - Solution
ARC185 A - mod M Game 2
简要题意
Alice 和 Bob 玩卡牌游戏。每个人都有一副 \(N\) 张卡牌,分别标上数字 \(1 \sim N\)。
现从 Alice 开始,两人轮流出牌放入牌堆,每人每局恰好出一张牌,出过的牌不能再出;如果在某一时刻,牌堆里所有牌的数字总和是 \(M(N<M)\) 的倍数,则刚刚出牌的玩家输,游戏结束。
特殊地,若双方的牌都出完了,游戏还未结束,则 Alice 赢。
问:若双方都按最优方式出牌,哪位玩家会赢?
询问个数 \(T \le 10^5\),\(N,M \le 10^9\)。
思路
博弈论。
首先可以发现,若某位玩家手上有 \(\ge 2\) 张牌,游戏不会立即结束。
证明:
假如我手上有两张牌,\(a_1\) 和 \(a_2\)。
如果我不管怎么打,当前都会输,那么有:
\(\begin{cases} S'+a_1 \equiv 0 \pmod{M} \\ S'+a_2 \equiv 0 \pmod{M} \end{cases}\)
所以有 \(a_1 \equiv a_2 \pmod{M}\)。
又由于 \(a_1 \neq a_2\) 且 \(1 \le a_1, a_2 \le N < M\),与上式矛盾。
推广到 \(> 2\) 张牌的情况,可见只要我有不止一张牌,当前就不会输,即游戏不会立即结束。
有了上面的性质,我们只需要关注双方出的最后一张牌即可。
由于牌都打完算 Alice 赢,所以只要 Alice 的最后一张牌打完后没有输,她就一定赢。
设 Bob 的最后一张牌是 \(b\)。显然当 Alice 的最后一张牌打完后,牌堆里的数字和是 \(n(n+1)-b\)。
那么对于 Bob,他只要判断:是否可以选出一张牌 \(b\),作为自己的最后一张牌;使得在自己打出这张牌前,牌堆里的数字和是 \(M\) 的倍数,让 Alice 输掉。
即 Bob 能赢当且仅当,存在一个数 \(b(1\le b \le N)\),满足 \(n(n+1)-b \equiv 0 \pmod{m}\)。
显然 \(b\) 取 \(n(n+1) \bmod m\)。判断 \(b\) 作为一张牌是否能被取到,就做完了。
代码实现
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
long long n,m;
scanf("%lld%lld",&n,&m);
long long b=n*(n+1)%m;
if(b>=1&&b<=n) puts("Bob");
else puts("Alice");
}
return 0;
}