此题属于尼姆博奕(Nimm Game):有n堆各若干个物品,两个人轮流从某一堆取任意多(或者最多m个,只需把每堆%m)的物品,规定每次至少取一个,多者不限,最后取光者得胜。
强记策略: n堆物品数量对应的n个二进制数,连续n-1次异或运算,若结果为0,则说明所有位平衡,后者获胜,若结果为1,则说明存在非平衡位,前者获胜。
#include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)//输入火柴堆数
{
int a=0,b; //b表示当前堆的火柴数
for(int i=0;i<n;i++)//输入每堆火柴的数量
{
cin>>b;
a^=b; //异或当前堆的火柴数
}
if(a) //若a出现非平衡位则先手的玩家赢
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}