为了方便考虑,不妨规定只有当当前的巧克力棒都取完了,才能拿新的巧克力棒
然后令先手第一个拿的集合为S,根据nim游戏,当S的xor不为0时先手(即原来的后手)必胜,又轮到先手拿集合,那么只要一直不存在xor为0的集合,先手最终就必败
然后当存在xor为0的集合,那么先手必然可以做到取一个最大xor子集,那么剩下的集合中一定不存在xor为0的子集(否则就可以更大),然后就变成了先手必胜
判断是否存在xor为0的子集可以用线性基来判定(当然这个n太小暴力也行)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,x,s,a[105]; 4 void add(int x){ 5 for(int i=30;i>=0;i--) 6 if (x&(1<<i)) 7 if (a[i])x^=a[i]; 8 else{ 9 s++; 10 a[i]=x; 11 break; 12 } 13 14 } 15 int main(){ 16 for(int ii=1;ii<=10;ii++){ 17 scanf("%d",&n); 18 s=0; 19 memset(a,0,sizeof(a)); 20 for(int i=1;i<=n;i++){ 21 scanf("%d",&x); 22 add(x); 23 } 24 if (s<n)printf("NO "); 25 else printf("YES "); 26 } 27 }