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 }

 

posted @ 2016-03-11 18:46  GFY  阅读(374)  评论(0编辑  收藏  举报