石子 无限拿

给定  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";
 
}