hdu 1850 Being a Good Boy in Spring Festival (Nim)

http://acm.hdu.edu.cn/showproblem.php?pid=1850

Nim博弈,求保证先手必胜可选的方案数。

对于一个必胜的局面,至少有一个方案可以到达必败局面。也就是说,对于a1^a2..^an!=0一定有一个ai可以改为ai',且a1^a2..^ai'..^an==0。设a1^a2..^an=k,则一定存在某个ai,它的二进制表示在k的最高位上是1(因为k的最高位为1),那么有ai^k<ai成立。则a1^a2..^an^k=0,可得ai'=ai^k。

题意找有多少种先手必胜的方案,枚举ai,统计满足ai^k<ai的个数即可。

code:

#include<cstdio>
int a[ 101] ;
int main(){
     int n, i, ans, count ;
     while(~scanf( " %d ", &n)&&n){
        ans = count =  0 ;
         for(i= 0; i<n; i++){
            scanf( " %d ", &a[i]) ;
            ans ^= a[i] ;
        }
         if(!ans){
            printf( " 0\n ");
             continue ;
        }
         for(i= 0; i<n; i++) // 枚举ai
             if(a[i]>(ans^a[i])) count ++ ;
        printf( " %d\n ", count) ;
    }
     return  0 ;} 

你可能感兴趣的:(spring)