博弈专题 nim博弈:必胜第一步方案数
题目链接:https://vjudge.net/contest/299140#problem/K
题目大意:
二人小游戏:桌子上有M堆扑克牌;每堆牌的数量分别为Ni(i=1…M);两人轮流进行;每走一步可以任意选择一堆并取走其中的任意张牌;桌子上的扑克全部取光,则游戏结束;最后一次取牌的人为胜者。
现在我们不想研究到底先手为胜还是为负,我只想问大家:
——“先手的人如果想赢,第一步有几种选择呢?”
思路:直接看代码
#include <bits/stdc++.h>
#define LL long long
using namespace std;
int a[1000010];
int main()
{
int n, ans=0, sum=0;
while(scanf("%d",&n),n)
{
ans=0, sum=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
ans^=a[i];
}
for(int i=0;i<n;i++)
{
if((ans^a[i])<=a[i])//a[i]-(ans^a[i])为具体方案
{
sum++;
}
}
if(ans==0)
{
printf("0\n");
}
else
{
printf("%d\n",sum);
}
}
return 0;
}