题意: n堆石子, 最后没得取的输, 问如果第一个人赢的话, 他第一次有多少种取法.
思路: 每次取任意个的话, 如果异或和!=0就能赢.
设现在能赢, x1^x2^x3^x4^x5^...^xn=k, 那么如果存在一个x1', 使得x1'^x2^x3^x4^x5^...^xn=0, 那么取x1堆就是可行的方式, 进一步地, 如果存在一个x1'=x1^k, 且x1'<x1(取了当然变少), 那么这个x1'就是合理的. 所以第一次取完所剩的就是x1'=x1^k.
同时, 由上面的推理我们可知x1对应的x1'是唯一的, 也就是说每堆最多只会有1个贡献.
代码:
#include<bits/stdc++.h>
#define fuck(x) std::cout<<"["<<#x<<"->"<<x<<"]"<<endl;
using namespace std;
typedef long long ll;
const int M=2e5+5;
const int inf=1e9+5;
const int mod=1e9+7;
int x[1005];
int main() {
int m;
while(~scanf("%d",&m)&&m) {
int now=0;
for(int i=0; i<m; i++) {
scanf("%d",&x[i]);
now^=x[i];
}
int ans=0;
for(int i=0; i<m; i++) {
if( (now^x[i]) < x[i])
ans++;
}
printf("%d\n",ans);
}
return 0;
}