成仙之路−> 算法基础课题解
Nim游戏
结论: 若 a1⨁a2⨁…⨁an=0, 则先手必败,反之先手必胜
概念:
- 必败状态:无法走到任何一个必败状态
- 必胜状态:可以走到某一个必败状态
证明:
- 第一步
操作到最后,游戏必定能够结束,即 0⨁0⨁…⨁0=0
- 第二步
假设 a1⨁a2⨁…⨁an=0为必败状态,反之为必胜状态
假设从 ai 中拿走部分石子变为 ai′ 后依旧为必败状态,即 a1⨁a2⨁…⨁ai′⨁…⨁an=0
则 ai⨁ai′=0,即 ai=ai′,故假设不成立,即必败状态:无法走到任何一个必败状态
- 第三步
假设必胜状态 a1⨁a2⨁…⨁an=x的二进制最高位在第k位,则必存在ai的第k位为1,则ai⨁x<ai
那么我们在第i堆石子取走 ai−(ai⨁x) 后则变为 ai⨁x
则 a1⨁a2⨁…⨁ai⨁x⨁…⨁an=x⨁x=0,即必胜状态:可以走到某一个必败状态
- 综上即可得出结论
完整代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int res=0;
while(n--)
{
int x;
cin>>x;
res^=x;
}
if(res) puts("Yes");
else puts("No");
return 0;
}