codeforces 603C. Lieges of Legendre sg函数

题目链接

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 }
原文地址:https://www.cnblogs.com/yohaha/p/5056487.html