HDU 3389

对于这道题,我们需要从(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
",t);
43         else 
44         printf("Case %d: Bob
",t);
45     }
46     return 0;
47 }
View Code
原文地址:https://www.cnblogs.com/jie-dcai/p/3776341.html