POJ 2975 Nim

回顾基础博弈论:

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
",ans);
        }
    }
    return 0;
}

  

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