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 ;} 
posted on 2012-04-29 20:51  追逐.  阅读(200)  评论(0编辑  收藏  举报