题目请点我
题解:
这道题是Nim的变形,要求求出有多少种必胜的策略。当状态为奇异状态时有等式:a0^a1^a2…..^an=0.则我们要求的就是有多少种可能使经过一次变换得到奇异状态。又有等式a^b^(a^b)=0,则若当前状态是a^b^c^=0时,若c>(a^b),则我们就可以经过一次操作得到奇异状态。同理,多个变量也是一样,我们挨个比较就好了。设a0^a1^a2…..^an=res,则ai^a0^a1^a2…..^an=ai^ai^(a0^a1^a2^…..ai-1^ai+1^…..^an)=(a0^a1^a2^…..ai-1^ai+1^…..^an)=res^ai.
参考博客
代码实现:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define MAX 110
using namespace std;
int N;
int res;
int sum;
int num[MAX];
int main()
{
while( scanf("%d",&N) != EOF && N ){
res = 0;
sum = 0;
for( int i = 0; i < N; i++ ){
scanf("%d",&num[i]);
res ^= num[i];
}
for( int i = 0; i < N; i++ ){
if( num[i] > (res^num[i]) ){
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}