博弈论1

黑子今天又跑去姐姐大人的寝室玩了,今天黑子和姐姐大人玩取硬币,有一堆硬币共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;
}

猜你喜欢

转载自blog.csdn.net/henucm/article/details/79691623