博弈论1

本文介绍了一种通过算法判断在特定硬币游戏中哪位玩家能够获胜的方法。游戏规则为两名玩家轮流从一堆硬币中取走硬币,每次取走的数量有限制,拿到最后一枚硬币的玩家获胜。文章提供了完整的C++实现代码,并解释了背后的数学原理。

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

黑子今天又跑去姐姐大人的寝室玩了,今天黑子和姐姐大人玩取硬币,有一堆硬币共n枚,炮姐和黑子两个人轮流拿,炮姐先拿,每次最少拿1枚,最多拿k枚,拿到最后一枚硬币的人获胜,假设炮姐和黑子都非常聪明,拿硬币的过程中不会出现失误,给2个数n和k,问最后谁能赢得比赛。

输入

第1行,一个数t,一共有t组测试

数据范围:(1 <= t <= 10000)

第2-->t+1行,每行两个数n,k中间用空格分隔

数据范围: (1 <= n,k <= 10^9)
输出
共t行
如果炮姐获胜输出“Misaka Mikoto Win”(不带引号)
如果黑子获胜输出“Shirai Kuroko Win”(不带引号)
样例输入
4
3 2
4 2
7 3
8 3
样例输出
Shirai Kuroko Win
Misaka Mikoto Win
Misaka Mikoto Win
Shirai Kuroko Win
提示
样例1:n = 3,k = 2。无论炮姐如何拿,黑子都可以拿到最后1枚硬币

你可以把n个硬币分成好几组,每组的数量都是n 1,分好后会有两种情况。

1.刚好分成x组,每组有(k+1)个
这种情况下,如果第一个人拿a个,那第二个人就拿(k+1-a)个。每轮刚好可以拿完一组,这样就可以保证第二个人拿到最后一个硬币。

2.无法刚好分成x组。只好分成x 1组,前x组每组都有(k+1)个,最后一组的数量不足(k+1)个,假设只有b个这样的话只要,第一个人首先拿b个,情况就发生了反转,变成了第一种情况,只不过相当于换成了第二个人先拿。所以第一个人肯定可以拿到最后一枚硬币

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
	int n;
	cin>>n;
	while(n--) 
	{
		int a,b;
		cin>>a>>b;
		if(a%(b+1)==0)
		printf("Shirai Kuroko Win\n");
		else
		printf("Misaka Mikoto Win\n");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值