CF1194D 1-2-K Game

一篇关于CF1194D题目的解析,讨论了一种两人轮流取石子的游戏,其中每次可以取1, 2或k个石子。文章深入分析了当k为3的倍数和非3的倍数时,游戏的必胜策略,揭示了游戏胜负与石子数量模k+1的关系,并提供了解决方案。" 113650509,10679718,使用NEST在WebApi中操作Elasticsearch,"['Elasticsearch', 'NEST', 'Web开发', 'API设计', '.NET']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

题目大意

n n n 个石子,一次可以取 1 , 2 1,2 1,2 k k k 个,两人轮流取,取到最后一个胜利,问谁有必胜策略。

Solution

一眼巴什博奕。

如果没有可以取 k k k 个这一条件,那么就是裸的博弈,那么我们来考虑可以取 k k k 个这一条件对答案产生了什么影响。首先,我们做巴什博奕是利用了分组的思想,即以 3 3 3 个为一组,如果我在一组中是后手,那么显然有必胜的策略。

那么如果取 k k k 个,会对最后分组有什么影响呢?我们分两种情况考虑:

Case1: k k k 不是 3 3 3 的倍数

此时,如果我取一次 k k k 其实相当于取了一次 k % 3 k\%3 k%3。因为如果 n % 3 = 0 n\%3=0 n%3=0,先手不可能通过取一次 k k k 把石子取完,所以和取 1 1 1 2 2 2 没有什么区别。而如果 n % 3 ≠ 0 n\%3\neq 0 n%3=0,那么只需要先手把余数取掉,仍然必胜。

所以如果是 k % 3 ≠ 0 k\%3\neq 0 k%3=0,那么直接做巴什博奕就可以了。

Case2: k k k 3 3 3 的倍数

此时有个问题,如果取一次 k k k 那么相当于交换了一次先后手,会对之后的决策造成极大的影响。此时不好思考,我们来考虑找找规律。

如果 k = 6 k=6 k=6,则有如下胜负, A A A 表示先手必胜, B B B 表示后手必胜:

n012345678910 ⋯ \cdots
resBAABAAABAAB ⋯ \cdots

可以发现,结果是以 k + 1 k+1 k+1 为一个循环周期的。为什么会这样呢?因为在 n = k n=k n=k 的时候,本来是后手必胜的,但现在是先手必胜,导致 n = k + 1 n=k+1 n=k+1 时后手必胜。同理,我们也可以列出 k = 9 k=9 k=9 的情况来看看:

n012345678910 ⋯ \cdots
resBAABAABAAAB ⋯ \cdots

果然是这个规律,我们已经找出了如何解决 n % 3 = 0 n\%3=0 n%3=0 时的情况:只需要将 n n n 模上 k + 1 k+1 k+1,然后判断余数是否是 3 3 3 的倍数且不是 k k k,如果是,那么后手胜,否则先手胜。

Code

#include<bits/stdc++.h>
#define inf 1<<30
#define ll long long
#define INF 1ll<<60
using namespace std;
void solve(){
	int n,k;
	scanf("%d%d",&n,&k);
	if(k%3){
		if(n%3) puts("Alice");
		else puts("Bob");
	}else{
		int rem=n%(k+1);
		if(rem%3==0&&rem!=k) puts("Bob");
		else puts("Alice");
	}
}
int main()
{
	int T;
	for(scanf("%d",&T);T--;)
		solve();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值