HDU3032 nim博弈

题目大意:

可以从某一堆中取任意个数,也可把一堆分成两个不为0的堆,直到某一方无法操作为输

 

因为是nim博弈,所以只要考虑一堆时候的sg值,把所有堆的sg值异或即可

很显然这里 0 是一个终止态 sg[0]=0;

sg[1]=1 ;

2 的时候可分为 0 , 1 , (1,1) 3种情况,sg值分别为 0,1,0,所以sg[2]=2

3的时候可分为0,1,2,(1,2),sg值分别为0,1,2,3,所以sg[3]=4

而4的时候sg[4]=3

多试验可得sg(4k)=4k-1;sg(4k+1)=4k+1;sg(4k+2)=4k+2;sg(4k+3)=4k+4;

 

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <iostream>

 4 using namespace std;

 5 

 6 int main()

 7 {

 8   //  freopen("a.in" , "r" , stdin);

 9     int T;

10     scanf("%d" , &T);

11     while(T--)

12     {

13         int n,a;

14         int ans=0;

15         scanf("%d" , &n);

16         for(int i=0 ; i<n ; i++){

17             scanf("%d",&a);

18             if(a%4==0) ans^=(a-1);

19             else if(a%4==3) ans^=(a+1);

20             else ans^=a;

21         }

22         if(ans) printf("Alice\n");

23         else printf("Bob\n");

24     }

25     return 0;

26 }

 

你可能感兴趣的:(HDU)