传送门:点击打开链接
题意:N堆石子,轮流取石子,先取完的胜利。取石子的方法有两种。
1.在某一堆中取1个
2.如果某一堆里的石子个数为偶数(2*x),可以拆成k堆石子,每堆石子x个
思路:对k的奇偶性讨论,然后再打出SG函数表,很容易就能找到规律,再把规律写出来就做完了
#include<map>
#include<set>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define fuck(x) cout<<"["<<x<<"]"
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w+",stdout)
using namespace std;
typedef long long LL;const int MX = 1e5 + 5;int SG1[MX], SG2[MX], vis[10];/*这个是打表程序
void presolve() {SG1[0] = SG2[0] = 0;for(int i = 1; i < MX; i++) {memset(vis, 0, sizeof(vis));vis[SG1[i] = SG1[i - 1]] = 1;if(i % 2 == 0) vis[SG1[i / 2]] = 1;for(int j = 0; j < 10; j++) {if(!vis[j]) {SG1[i] = j;break;}}memset(vis, 0, sizeof(vis));vis[SG2[i] = SG2[i - 1]] = 1;if(i % 2 == 0) vis[0] = 1;for(int j = 0; j < 10; j++) {if(!vis[j]) {SG2[i] = j;break;}}}for(int i = 1; i <= 100; i++) {printf("[%d:%d]\n", i, SG2[i]);}
}*/int s1(int n) {if(n & 1) {if(n <= 3) return 1;else return 0;}if(n == 2) return 0;if(n == 4) return 2;int t = s1(n / 2);if(t == 1) return 2;return 1;
}int s2(int n) {if(n == 1) return 1;if(n == 2) return 2;if(n & 1) return 0;return 1;
}int main() {//presolve();int n, k, t; //FIN;while(~scanf("%d%d", &n, &k)) {int sum = 0;for(int i = 1; i <= n; i++) {scanf("%d", &t);if(k & 1) sum ^= s1(t);else sum ^= s2(t);}if(sum) printf("Kevin\n");else printf("Nicky\n");}return 0;
}