题意:就是nim博弈,之后问你有几种赢的方法。
思路:nim博弈赢得方法就是他们的异或和为0嘛,我们先把这些石子都异或一遍之后得到一个值ans,之后异或a[i],这步操作的意思就是我抵消了a[i]操作嘛,看看我们要不要拿第i堆石子,如果 ans^a[i] < a[i] ,就说明我拿了当前这堆石子之后,我们可以把这堆石子拿走把他变成一个异或和为0的状态(因为a[i] 大 ,所以总可以把他变成一个异或和为0)那么我们就++就好了,上代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 1e3+10;
int a[maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n == 0 )break;
int te;
int SG = 0;
for(int i = 0 ; i < n ; i++)
{
scanf("%d",&a[i]);
SG ^= a[i];
}
int ans = 0;
for(int i = 0 ; i < n ; i++)
{
if((a[i] ^ SG) < a[i]) ans ++;
}
cout<<ans<<endl;
}
return 0;
}