n堆石子, 可以拿走一堆中的一颗, 或者将一堆数量为2*x的石子分为k堆x个的石子。k由题目给出。
k分奇偶讨论。 k为偶数时,k堆x个的石子异或结果为0; k为奇数时, k堆x个石子异或结果与mex(x)相等, 然后打不同的sg表找规律, 打表程序看代码。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define pb(x) push_back(x) 4 #define ll long long 5 #define mk(x, y) make_pair(x, y) 6 #define lson l, m, rt<<1 7 #define mem(a) memset(a, 0, sizeof(a)) 8 #define rson m+1, r, rt<<1|1 9 #define mem1(a) memset(a, -1, sizeof(a)) 10 #define mem2(a) memset(a, 0x3f, sizeof(a)) 11 #define rep(i, a, n) for(int i = a; i<n; i++) 12 #define ull unsigned long long 13 typedef pair<int, int> pll; 14 const double PI = acos(-1.0); 15 const double eps = 1e-8; 16 const int mod = 1e9+7; 17 const int inf = 1061109567; 18 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; 19 int sg[105]; 20 /*int mex1(int x) { 21 if(~sg[x]) 22 return sg[x]; 23 int vis[105]; 24 mem(vis); 25 vis[mex1(x-1)] = 1; 26 if(x%2==0) //k为奇数 27 vis[mex1(x/2)] = 1; 28 for(int i = 0; ; i++) 29 if(!vis[i]) 30 return sg[x] = i; 31 } 32 int mex2(int x) { //k为偶数 33 if(~sg[x]) 34 return sg[x]; 35 int vis[105]; 36 mem(vis); 37 vis[mex2(x-1)] = 1; 38 if(x%2==0) 39 vis[0] = 1; 40 for(int i = 0; ; i++) 41 if(!vis[i]) 42 return sg[i] = i; 43 }*/ 44 int mex2(int x) { 45 if(x<=2) { 46 return x; 47 } 48 if(x&1) 49 return 0; 50 return 1; 51 } 52 int mex1(int x) { 53 if(x<=4) { 54 if(x&1) 55 return 1; 56 if(x==2) 57 return 0; 58 return 2; 59 } 60 if(x&1) 61 return 0; 62 int tmp = mex1(x/2); 63 if(tmp==1) 64 return 2; 65 return 1; 66 } 67 int main() 68 { 69 mem1(sg); 70 /*sg[0] = 0; 71 for(int i = 0; i<=100; i++) 72 sg[i] = mex1(i); 73 for(int i = 0; i<=100; i++) { 74 printf("[%d:%d] ", i, sg[i]); 75 }*/ 76 int n, k, x, ans = 0; 77 cin>>n>>k; 78 while(n--) { 79 scanf("%d", &x); 80 if(k&1) 81 ans ^= mex1(x); 82 else 83 ans ^= mex2(x); 84 } 85 if(!ans) { 86 puts("Nicky"); 87 } else { 88 puts("Kevin"); 89 } 90 return 0; 91 }