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
", i, solve(n, K) ? "first" : "second");
}
return 0;
}