HDU1850 Being a Good Boy in Spring Festival

解题报告:Nim博弈的获胜方法数量
解题报告:题目的意思很简单!就是一个Nim博弈!但是不是问谁获胜,本题而是问的获胜的方法有多少种!首先,我们必须知道,因为是起手,对于M堆扑克,最多有M种获胜的方法!对res = M1 ^ M2 ^ M3 …. ^ Mm取异或(^)得res,由异或的性质知:res ^ Mi = ( M1 ^ M2 …^M(i-1) ^ M(i+1) ^ … ^Mm ) 也就是说res对任意一个数取^可以的得到其他所有数的^值,例如:5 7 95^7^9=0101^0111^1001=1011=11;那么11^5=1011^0101=1110=0111^1001=14;那么要保证先手取后剩余局势处于必败点,那么只有保证在这5张牌的牌堆里取出一些牌后,可以使得x^1110=0x=1110=14那么也就是说这个牌堆数必须大于14才有可能达到这种状态;现在只有5张牌,显然不能,而对于牌堆9,有(res^9=0010=29显然大于2,所以只需要拿走7张牌就可以让局势处于必败点!
<pre name="code" class="cpp">#include<cstdio>
#define N 105
int a[N];
int main()
{
    int n,i,ans,res;
    while(scanf("%d",&n)!=EOF&&n){
        res=0;
        for(i=0;i<n;i++){
            scanf("%d",&a[i]); res=res^a[i];
        }
        ans=0;
        for(i=0;i<n;i++){
            if(a[i]>(res^a[i])) ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}




                
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值