(传送门)
这道题虽然还是石子,但是用SG函数分析一下x的后继状态,有
1,2,3,……,n-1,以及(1,n-1),(2,n-2),(3,n-3)……
所以可以得到:
sg(x)=mex(sg(1),sg(2),sg(3),……,sg(n-1),sg(1)^sg(n-1),sg(2)^sg(n-2)……)
这样sg(x)不一定等于x,不过我们还是可以找规律。先写一个求1-100的sg函数。
#include<cstdio>
#include<cstring>
bool vs[105];
int sg[105];
int main()
{
sg[0]=0;
for (int i=1;i<=100;i++)
{
memset(vs,0,sizeof(vs));
for (int j=1;j<i;j++) vs[sg[j]]=1;
for (int j=1;j<i;j++) vs[sg[j]^sg[i-j]]=1;
for (int j=1;j<=102;j++)
if (!vs[j]){sg[i]=j; break;}
}
for (int i=1;i<=100;i++) printf("%d %d\n",i,sg[i]);
return 0;
}
结果输出为:
1 1
2 2
3 4
4 3
5 5
6 6
7 8
8 7
9 9
10 10
11 12
12 11
13 13
14 14
15 16
16 15
17 17
18 18
19 20
20 19
21 21
22 22
23 24
24 23
25 25
26 26
27 28
28 27
29 29
30 30
31 32
32 31
33 33
34 34
35 36
36 35
37 37
38 38
39 40
40 39
41 41
42 42
43 44
44 43
45 45
46 46
47 48
48 47
49 49
50 50
51 52
52 51
53 53
54 54
55 56
56 55
57 57
58 58
59 60
60 59
61 61
62 62
63 64
64 63
65 65
66 66
67 68
68 67
69 69
70 70
71 72
72 71
73 73
74 74
75 76
76 75
77 77
78 78
79 80
80 79
81 81
82 82
83 84
84 83
85 85
86 86
87 88
88 87
89 89
90 90
91 92
92 91
93 93
94 94
95 96
96 95
97 97
98 98
99 100
100 99
有什么规律?对x%4进行分析:当x%4等于1或2时,sg(x)=x,当x%4=3时,sg(x)=x+1; 当x%4==0时,sg(x)=x-1。所以利用这个规律套SG定理,求一趟异或就行了。
#include<cstdio>
using namespace std;
int n,ans,x;
inline void readi(int &x)
{
x=0; char ch=getchar();
while ('0'>ch||ch>'9') ch=getchar();
while ('0'<=ch&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
}
int main()
{
readi(n); ans=0;
for (int i=1;i<=n;i++)
{
readi(x);
switch (x%4)
{
case 0:x--; break;
case 3:x++; break;
}
ans^=x;
}
if (ans) printf("Alice");
else printf("Bob");
return 0;
}