思路:标准的尼姆博弈,设当前异或值为sum,则答案就是有多少个石堆y满足y>x^y(也就是旧的大于新的)只要这样才能从这石堆里拿走y-(x异或y)的石子后就会形成奇异局势。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+1;
typedef long long ll;
ll a[maxn],num[maxn],sum=0;
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%lld",&a[i]);
sum^=a[i];
for(int j=0;j<62;++j) if((a[i]>>j)&1) num[j]++;
if(sum==0){
printf("0\n");continue;
}
ll t=sum,cnt=-1;
while(t) cnt++,t>>=1;
printf("%lld\n",num[cnt]);
}
}