博弈专题 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;
}
全部评论

相关推荐

10-31 11:57
门头沟学院 Java
点赞 评论 收藏
分享
FFFcaptain328:入职即送东南亚腰子之旅👿
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务