我感觉好难理解,大致原理懂,但还不是完全的懂。
https://www.acwing.com/problem/content/893/
首先介绍两种状态 : 必胜状态和必败状态
- 必胜状态: 先手进行某一个操作,留给后手是一个必败状态时,对于先手来说是一个必胜状态。
即先手可以走到某一个必败状态。也就是说当我进行操作后,后面的人无论如何搞都是必输的,那么对我来说这就是一个必胜状态。 - 必败状态: 先手无论如何操作,留给后手都是一个必胜状态时,对于先手来说是一个必败状态。
先手走不到任何一个必败状态。也就是说当我进行操作后,后面的人无论如何搞都是必赢的,那么对我来说这就是一个必败状态。
结论:
假设n堆石子,石子数目分别是a1,a2,…,an,如果a1⊕a2⊕…⊕an≠0,先手必胜;否则先手必败。
这里有一个nim值的概念: nim=a1⊕a2⊕…⊕an
如果nim=0,表示这是一个平衡的状态,nim!=0表示这是一个不平衡的状态。只有这两种状态。
当先手此时的状态不是平衡态(即nim!=0)时,此时他进行操作一定可以将其转换为平衡态(即nim=0),因为只有这两种状态。
此时后手面对的是平衡态,无论他如何拿必定会打破平衡态(nim!=0),此时先手又遇到了不平衡态,依次往复,后手必输。
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int main(void)
{
int n; cin>>n;
int x;
int ans=0;
for(int i=0;i<n;i++) cin>>x,ans=ans^x;
if(ans==0)cout<<"No"<<endl;
else cout<<"Yes"<<endl;
return 0;
}