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\n",ans);
}
}
return 0;
}
永远年轻 永远热泪盈眶!

浙公网安备 33010602011771号