SG
http://blog.csdn.net/qq_24451605/article/details/50154973
这篇题解写的很好
大概想出来一点点。但是还是参考了sg的部分分析
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define maxn 100010
using namespace std;
int n, k;
int a[maxn];
int f[maxn];
int dfs(int x){
if(x < 6)return f[x];
if(x & 1)return 0;
return dfs(x / 2) == 1 ? 2 : 1;
}
int main(){
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i ++)
scanf("%d", &a[i]);
if (k & 1){//Mex
f[0] = f[2] = f[5] = 0;
f[1] = f[3] = 1;
f[4] = 2;
}
else{
f[0] = f[3] = f[5] = 0;
f[1] = f[4] = 1;
f[2] = 2;
}
int sg = 0;
for(int i = 1; i <= n; i ++){
if(k & 1){
if(a[i] < 6)sg ^= f[a[i]];
else sg ^= dfs(a[i]);
}
else{
if(a[i] < 6)sg ^= f[a[i]];
else sg ^= a[i] & 1 ? 0 : 1;
}
}
puts(sg ? "Kevin" : "Nicky");
return 0;
}