0
点赞
收藏
分享

微信扫一扫

HDU1850 Being a Good Boy in Spring Festival


解题报告:题目的意思很简单!就是一个Nim博弈!但是不是问谁获胜,本题而是问的获胜的方法有多少种!首先,我们必须知道,因为是起手,对于M堆扑克,最多有M种获胜的方法!对 res = M1 ^ M2 ^ M3 …. ^ Mm 取异或(^)得res,由异或的性质知: res ^ Mi = ( M1 ^ M2 …^M(i-1) ^ M(i+1) ^ … ^Mm )   , 也就是说res对任意一个数取^可以的得到其他所有数的^值,例如:5 7 9;5^7^9=0101^0111^1001=1011=11;那么11^5=1011^0101=1110=0111^1001=14;那么要保证先手取后剩余局势处于必败点,那么只有保证在这5张牌的牌堆里取出一些牌后,可以使得x^1110=0即x=1110=14那么也就是说这个牌堆数必须大于14才有可能达到这种状态;现在只有5张牌,显然不能,而对于牌堆9,有(res^9)=0010=2,9显然大于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;
}



举报

相关推荐

0 条评论