题意
尼姆游戏,本题不仅需要判断先手是否能赢,如果能赢要输出他第一步取石子的方案数,否则输出0。
思路
如果该状态是非平衡态,那么先手必胜,否则先手必败。什么是非平衡态呢?只要将所有石子堆的石子数目相异或,结果为0则为平衡态,非0则为非平衡态,这时候先手可以取走其中一堆的部分石子,使其转化为平衡态,那么先手一定能取到最后一个石子。
解决了先手是否必胜的问题还要计算出先手如果必胜,第一步有几种策略。
令k=a1^a2^a3^……^an,当k^ai
#include<iostream>
using namespace std;
int a[101];
int main()
{
int n,i;
while(cin>>n&&n)
{
int k=0;
for(i=1;i<=n;i++)
{
cin>>a[i];
k^=a[i];
}
if(k==0)//此时先手必败,直接输出0
{
cout<<0<<endl;
continue;
}
int cnt=0;
for(i=1;i<=n;i++)
{
int t=k^a[i];
if(t<a[i])
cnt++;
}
cout<<cnt<<endl;
}
return 0;
}