标签:
解题报告:题目的意思很简单!就是一个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; }
HDU1850 Being a Good Boy in Spring Festival
标签:
原文地址:http://blog.csdn.net/a197p/article/details/46336235