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\n",t); 43 else 44 printf("Case %d: Bob\n",t); 45 } 46 return 0; 47 }