对于这道题,我们需要从(A+B)%3==0这式子考虑。对于第一条式子,我们可以知道,只能是奇偶盒子交替转移。
由第二条式子可知,要么是同余为0的A,B之间转移,要么是余数为1,2之间的
转移。后来仔细比对发现,同余为0的只能是一条路径(即只能在同余为0之间转移)内。对于1,2之间的转移,恰好是两条路径分别是以1,2开始的一条和以4,5盒子开始的一条。三条路径是不相交的。于是,分别是三个单独的SG游戏。
利用梯阶博弈分别对三条路径进行求SG即可。
1 #include <iostream>
2 #include <cstdio>
3 #include <algorithm>
4 using namespace std;
5
6 const int MAX=10010;
7 int a[MAX],n;
8
9 int main(){
10 int cas; int t=0;
11 scanf("%d",&cas);
12 while(++t<=cas){
13 scanf("%d",&n);
14 for(int i=1;i<=n;i++){
15 scanf("%d",&a[i]);
16 }
17 int sum=0,cnt=-1;
18 for(int i=3;i<=n;i+=3){
19 cnt++;
20 if(cnt&1)
21 sum^=a[i];
22 }
23 cnt=-1;
24 for(int i=1;i<=n;i+=5){
25 for(int k=0;k<2&&i+k<=n;k++){
26 cnt++;
27 i+=k;
28 if(cnt&1)
29 sum^=a[i];
30 }
31 }
32 cnt=-1;
33 for(int i=4;i<=n;i+=5){
34 for(int k=0;k<2&&i+k<=n;k++){
35 cnt++;
36 i+=k;
37 if(cnt&1)
38 sum^=a[i];
39 }
40 }
41 if(sum)
42 printf("Case %d: Alice\n",t);
43 else
44 printf("Case %d: Bob\n",t);
45 }
46 return 0;
47 }
时间: 2024-10-27 18:20:05