前往:我自己搭建的博客
题目
洛谷P2197nim游戏
题解
假设第i堆石子有ai个。
当所有物品都被取完后,x=0,对手取走最后一个,我方失败。
若x!=0,设x的二进制表示下的最高位的1在第k位,那么至少存在一个ai,它的第k位为1,。显然,对ai有一种取法,使得x=0。
若x=0,任意一种取法都会导致x!=0。
综上,由数学归纳法得:x!=0先手必胜,因为永远可以让对手面对x=0的局面;x=0先手必败,因为永远可以让对手面对x!=0的必胜局面。
代码
#include <bits/stdc++.h>
using namespace std;
int n;
inline bool nim()
{
int ans=0,tmp;
for(int i=1;i<=n;i++) scanf("%d",&tmp),ans^=tmp;
if(ans) return 1;
else return 0;
}
int main()
{
int T; scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
if(nim()) printf("Yes\n");
else printf("No\n");
}
return 0;
}