poj 2975 Nim

Nim

 POJ - 2975 

题目大意:给定一种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\n",ans);
    }
    return 0;
}

 

posted @ 2017-12-28 10:20  Echo宝贝儿  阅读(102)  评论(0编辑  收藏  举报