题意:经典Nim游戏博弈,给你n堆牌,每堆a[i]张,每次能从一堆中取出任一张(不能为0),最后不能取者为输
问先手有几种取法保证他最后能获胜。
思路:让Nim_sum=0(a[1]^a[2]…………^a[n]=0)时则输,利用这个定理,对于第i堆a[i],除了第i堆,其它的
Nim_sum=k,如果a[i]>k,则先手从第i堆可以取a[i]-k张牌,让a[i]=k,最后a[i]^k==0。
#include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #include<cmath> #include<iostream> #include <queue> #include <stack> #include<algorithm> #include<set> using namespace std; #define INF 1e8 #define eps 1e-8 #define LL long long int main() { int n; int a[110]; while(scanf("%d",&n)&&n) { int st=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); st^=a[i]; } int ans=0; if(st==0) { printf("0\n"); } else { for(int i=0;i<n;i++) { if((st^a[i])<=a[i])//xor可以互逆 ans++; } printf("%d\n",ans); } } return 0; }
HDU 1850 Being a Good Boy in Spring Festival (Nim游戏变形),布布扣,bubuko.com