题目链接:Being a Good Boy in Spring Festival - HDU 1850 - Virtual Judge (ppsucxtt.cn)
这道题目显然是尼姆博弈,我们先来回顾一下尼姆博弈,一开始给定n堆石子,我们将n堆石子数目进行异或,当异或值为0时先手必败,反之先手必胜,如果n堆石子的数目异或值不为0,先手的操作目的就是使其异或值重新归0来使后手进入必败态,不妨假设n堆石子的数目分别为a1,a2,a3,……,an,设a1^a2^a3^……^an=k,则有a1^a2^a3^……^an^k=k^k=0,而我们的具体操作就是选择一堆石子ai,将其数目与k进行异或,并将其值变为ai^k即可,那结合实际情况易知,ai^k题目分析到这就分析完了,下面看代码:
#include#include #include #include #include using namespace std; const int N=1e6+10; int a[N]; int main() { int n; while(1) { scanf("%d",&n); if(n==0) break; int cnt=0,ans=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); ans^=a[i]; } if(ans==0) puts("0"); else { for(int i=1;i<=n;i++) if((ans^a[i])



