首页 > 代码库 > HDU3032 nim博弈
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 }
HDU3032 nim博弈
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。