Nim
题目大意:给定一种Nim状态(相当于含N堆石头),求能有几种方法能通过调整某一堆石头的状态(只准取出),使新的Nim状态为必败态。(或者说求出所给的Nim游戏状态有多少种方法能够赢)
/* 不妨假设一共有三堆石子,第i堆石子的个数用ai来表示,可以知道如果当前局面a1^a2^a3=0那么先手必败 所以题目要求的便是使得当前局面改变一个a值变成a1^a2^a3=0的方案数 所以此时a1^a2^a3!=0,假设a1^a2^a3=k; 则一定存在某个ai,它的二进制表示在k的最高位上是1,这时ai^k<ai一定成立。则我们可以将ai改变成ai'=ai^k,就能得到a1^a2^a3=0的局面 进而题目转化为满足ai^k<ai的ai的个数 */ #include<iostream> #include<cstdio> #define maxn 10010 int n,a[maxn]; using namespace std; int main(){ while(1){ scanf("%d",&n); if(n==0)return 0; int t=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); t^=a[i]; } int ans=0; for(int i=1;i<=n;i++) if((t^a[i])<a[i])ans++; printf("%d ",ans); } return 0; }