1. 程式人生 > 實用技巧 >HDU3951 Coin Game

HDU3951 Coin Game

hdu傳送門
vjudge傳送門


好久沒有做博弈論的題了,所以比賽的時候遇到這題基本上就是沒思路。


這題跟nim遊戲以及sg函式等博弈論知識沒什麼關係,但是用到了博弈論的一個經典思路:映象操作。
當玩家一拿完後,必然斷環成鏈,而如果玩家二再把這條鏈分成完全相同的兩部分,那麼只要完全仿照玩家一的做法,玩家二必然能贏。
所以只要判斷能否分成相等兩部分即可:
1.如果\(n \leqslant k\),那麼玩家一贏。
2.否則當\(k > 1\)的時候,必然能分成相等的兩部分,即玩家二贏。
3.當\(k=1\)\(n-1\)為奇數時,玩家二贏。

#include<cstdio>
#include<cctype>
using namespace std;
#define In inline
typedef long long ll;
In ll read()
{
	ll ans = 0;
	char ch = getchar(), las = ' ';
	while(!isdigit(ch)) las = ch, ch = getchar();
	while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
	if(las == '-') ans = -ans;
	return ans;
}

In bool solve(int n, int K)
{
	if(n <= K) return 1;
	if(K > 1) return 0;
	return n & 1;
}

int main()
{
//	MYFILE();
	int T = read();
	for(int i = 1; i <= T; ++i)
	{
		int n = read(), K = read();
		printf("Case %d: %s\n", i, solve(n, K) ? "first" : "second");
	}
	return 0;
}