标签:
有两个人做游戏,游戏规则如下:
有n堆石子,每次可以对一堆石子进行操作,如果当前石子是偶数,那么可以选择将这2*x个石子分成k堆石子数为x的石子堆,还有一种没有前提的操作是取走当前堆的一个石子,问先手赢还是后手赢,先手和后手都足够聪明的情况下。
首先对于这种组合游戏的题目,很容易想到利用SG函数来解。我们对于游戏的局势进行分类讨论:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define MAX 100007
using namespace std;
int n,k;
int a;
int f[MAX];
int dfs ( int x )
{
if ( x < 6 ) return f[x];
if ( x&1 ) return 0;
else
return dfs(x/2)==1?2:1;
}
int main ( )
{
while ( ~scanf ( "%d%d" , &n , &k ) )
{
int sum = 0;
for ( int i = 0 ; i < n ; i++ )
{
scanf ( "%d" , &a );
if ( k&1 )
{
f[0] = f[2] = f[5] = 0;
f[1] = f[3] = 1;
f[4] = 2;
if ( a < 6 )
sum^= f[a];
else
sum^= a&1?0:dfs(a);
}
else
{
f[0] = f[3] = 0;
f[1] = f[4] = 1;
f[2] = 2;
if ( a < 5 )
sum ^= f[a];
else
sum ^= a&1?0:1;
}
}
if ( sum ) puts ("Kevin");
else puts("Nicky");
}
}
codeforces #334 div1 603C Lieges of Legendre(博弈)
标签:
原文地址:http://blog.csdn.net/qq_24451605/article/details/50154973