回顾基础博弈论:
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; }