题意
给定nim游戏的一种局面,问你现在这一步有多少种取法使得你进入必胜态
思路
你的必胜态也就是对手的必败态,也就需要你这一步取完后剩下每堆的石子数量异或和为0,而一步只能选择一堆石子拿走一些,所以其他石子异或和不变,如果想要在这一堆石子中拿完一些后进入必胜态,需要这一堆石子剩下的数量为其他石子异或和。我们可以先将全部数量异或,然后再异或这一堆的石子数量得到其他石子异或和,然后判断这个数是否小于这一堆石子数量,如果小于就可以从这一堆中取走这两数之差个石子,是一种取法,否则,这一堆不能取,遍历一遍后可得答案
代码
#include <cstdio>
int k[1001];
int main()
{
int n,allxor,ans;
while(1)
{
scanf("%d",&n);
if(n==0)
break;
allxor=0;
ans=0;
for(int i=0;i<n;i++)
{
scanf("%d",&k[i]);
allxor^=k[i];
}
for(int i=0;i<n;i++)
if((allxor^k[i])<k[i])
ans++;
printf("%d\n",ans);
}
return 0;
}