
点击查看代码
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int res = 0;
for (int i = 1; i <= n; i ++) {
int x;
scanf("%d", &x);
if (i % 2) res ^= x;
}
if (res) puts("Yes");
else puts("No");
return 0;
}
- 结论:对奇数阶台阶,如果 $ a_1 \oplus a_3 \oplus \cdots \oplus a_n = x \neq 0 $,则先手必胜,否则,如果 $ a_1 \oplus a_3 \oplus \cdots \oplus a_n = 0 $,先手必败
证明:由经典 Nim 游戏可知,先手和后手在奇数阶台阶上的操作等价于经典的 Nim 游戏,
如果 $ a_1 \oplus a_3 \oplus \cdots \oplus a_n = x \neq 0 $,则先手在奇数阶台阶可以立于不败之地,如果后手选择偶数阶台阶,将一定数量的石子放到下一阶台阶,那么先手可以在下一回合将后手放的石子放到再下一个台阶,这样就可以保证奇数阶台阶不会受到偶数阶台阶的影响,最终后手必败,同理,先手必败的情况不再解释;
- 选择奇数阶而不选择偶数阶的原因:
假如对手处于偶数台阶的异或为 $ 0 $ 的局面,他可以通过把第一个台阶的所有石子全部放到地面上,而轮到我们的时候就只能破坏这个异或为 $ 0 $ 的局面(因为不能移动第 $ 0 $ 个台阶也就是地面,只能移动其他台阶的石子),把必胜的局面(异或为非 $ 0 $)给了对手。