石子 无限拿
给定 n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。
问如果两人都采用最优策略,先手是否必胜。
思路
若为 2, 3 堆, 先手在 3 堆里拿 1 个, 为 2 2。 之后只要跟后手拿的数量相同, 后手一定失败。
定理: 证明:
不等于 0 时, 设结果为 的二进制表示为 的二进制表示 一定存在 在 最高位 位上为 1。 则 , 那么就拿走 少的那一部分。
此时 带入到原来式子后得到: 故先手必赢。
等于 0 时, 设同样可以拿走一些, 剩下 个
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int readInt()
{
int t ;
scanf("%d", &t);
return t;
}
int n;
int main()
{
int x;
cin >> n;
cin >> x;
n -= 1;
while(n--)
x ^= readInt();
if(x) cout << "Yes\n";
else cout << "No\n";
}