原题链接:
题解:
本题是在Nim游戏基础上的一个进阶版本。
代码:
#include<bits/stdc++.h>
using namespace std;
int n, res = 0, m = 1;
int main() {
cin >> n;
while (n--) {
int x; cin >> x;
if (m % 2) res ^= x;
m++;
}
if (res) cout << "Yes" << endl;
else cout << "No" << endl;
}
疑惑点:
为什么不能只考虑偶数台阶, 让偶数台阶也变成NIM游戏呢?
首先需要明确Nim游戏中,每个玩家的操作都要使得当前状态发生改变。因此:
- 偶数台阶如果不包括0层,那么移动第一层的石子不符合Nim游戏,因为偶数台阶(2,4,6…)无变化。
- 偶数台阶如果包含0层,那么0层的石子是无法减少的,同样不符合Nim游戏。
- 只有奇数层可以符合Nim游戏的规则
首先模拟一下奇数台阶:
首先我们看异或不为零带来的是什么信息?---->就是在奇数台阶上肯定有石子可以拿(因为异或为零那么有可能是奇数台阶上的石子数量全为零,也有可能有石子但异或也为零(比如1 2 3)),但是异或不为零是肯定有石子的。所以只要一开始奇数台阶上是异或不为零,经过总的证明可以知道,我们肯定可以通过拿某奇数台阶上的石子是他们的异或为零。模拟一下:假如对手,不动奇数台阶上的石子,他将动偶数台阶上的石子,那么我们只需要跟着他操作,继续维持奇数台阶上的异或为零,所以说偶数台阶是不需要考虑的(因为离地面最近的台阶是1号台阶,奇数)。
模拟偶数台阶为nim:
假如我们以偶数台阶为nim的话,和奇数一样,我们维持偶数台阶上始终有石子可以给我们拿(就是当我们操作时他们异或不为零),当我们操作到最后,对手面临偶数台阶上没有一个石子,他一定不能再做吗?不然,首先模拟一下:我们最后一步操作时,假设所有偶数台阶上只有在2号台阶上剩一个,我们将他移到1号台阶上,此时留给对手的确实是偶数台阶上的异或为零,但是他还可以操作,就是将一号台阶上的石子移到地面,那么此时我们就输了。至于设奇数台阶为nim,就是因为一号台阶是奇数,且离地面最近,这样我们保证奇数台阶异或不为零,就是至少保证者一号台阶上有石子,那么我们就能掌握胜利