首页 > 其他 > 详细

POJ 2975 Nim

时间:2019-10-15 01:21:26      阅读:131      评论:0      收藏:0      [点我收藏+]

回顾基础博弈论:

Bash Game:

一堆石头有 n 个石头,每次至少拿一个最多m个,问先手是否必胜?

 如果满足条件 n = (m + 1)* k 则先手必败,否则先手必胜。

Nim Game:

给你 n 堆 石头, 每次可以从任意一堆拿出除 0 外任意个数的石头,问先手是否必胜?

看作组合游戏的特殊情况. mex(n) = n;

所以只要所有堆石子数异或和为 0 则先手必败。

题目:

问 Nim 开局有多少种取法可以失败。

假设 a1^a2^a3 ..... = s, 那么将任意一项变为 s ^ ai, 转变为了 s^a^a2^a3.....=0

判断 s ^ ai 是否小于 ai ( 因为你不能添加石头)

#include <iostream>
#include <cstdio>
#include <stdio.h>
#define ll long long
using namespace std;
const int maxn = 1e3 + 7;
int a[maxn];
int main()
{
    int n;
    while(scanf("%d",&n)&&n)
    {
        ll res = 0;
        for(int i = 0; i < n; i++)
            scanf("%d",&a[i]), res ^= a[i];

        if(!res) puts("0");
        else
        {
            int ans = 0;
            for(int i = 0; i < n; i++)
                if((a[i]^res)<a[i]) ans++;
            printf("%d\n",ans);
        }
    }
    return 0;
}

  

POJ 2975 Nim

原文:https://www.cnblogs.com/Edviv/p/11675046.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!