poj2975--Nim
题意:对于一个给定的取石子游戏,有多少种先手策略获胜?
Ans:若无法获胜,则输出0。
若能获胜我们只要找到一堆石子,使得我们能取它的一部分让总和的异或和变为0。我们先将整个游戏的值异或起来为s
则a[i]^s就是除了第i堆以外的其他所有堆的异或和,如果这个异或和小于a[i],说明我们可以通过取这堆石子让异或和等于0。
(为什么不能取等号?,因为一堆石子我们如果取,不能取0个石子)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<string> 6 #include<algorithm> 7 int n,ans,x,a[1005]; 8 int main(){ 9 while (~scanf("%d",&n)){ 10 if (n==0) break; 11 int s=0; 12 for (int i=1;i<=n;i++){ 13 scanf("%d",&a[i]); 14 s^=a[i]; 15 } 16 ans=0; 17 for (int i=1;i<=n;i++) 18 if ((s^a[i])<a[i]) ans++; 19 printf("%d\n",ans); 20 } 21 }