#include <iostream> #include <algorithm> #define ss(a) scanf("%d",&a) #define ss64(a) scanf("%I64d",&a) using namespace std; int main() { int a[100],i,n,m,sum,cnt,j; while(~ss(n),n) { cnt=0; for (i=0,sum=0;i<n;i++) { ss(a[i]); sum ^=a[i]; } if (sum==0) { cout<<"0"<<endl; } else { for (i=0;i<n;i++) { sum=0; for (j=0;j<n;j++) { if(i==j) continue; sum ^=a[j]; } if (a[i]>=sum) cnt++; } cout<<cnt<<endl; } } return 0; }
典型的Nim博弈。
对所有数异或,如果为0,则先手是必败,直接输出0结束;
如果不为0,再进行计算有几个方案,例如输入的事 5 7 8 9 10 (5堆扑克牌)
那么对于(5 7 8 9 10)呢?
1.从5中取不了,因为7^8^9^10=12
2.从7中取不了,因为5^8^9^10=10
3.可以从8中取1个(5,7,7,9,10)
4.可以从9中去除0个(5 ,7, 8, 9, 10)
5.可以从10中去除3个(5,7,8,9,7)
3 5 7 9 0
1