[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;
}
posted @ 2024-10-21 17:53  Greenzhe_awa  阅读(3)  评论(0编辑  收藏  举报