这可能是最简单的博弈论了;
思路上
我们需要假设状态p是先手的必胜态,那它也是后手的必败态;q是先手的必败态,它也是后手的必胜态;
当所有石子异或和为0时,先手不管怎么取,异或和都不会再为0了,如果异或和再为0那么肯定有之前的异或和肯定就不为0了(与之前的矛盾);而此时后手这个时候异或和不为0了,他不管怎么取一定可以再次把异或和取成0(由于最大的一堆石子一定大于等于异或和,所以一定能取走某些个是这个最大堆的石子个数与异或和一致);这样石子再不断减少,最后石子为0,可以证明这是q状态,也就是先手的必败态,后手的必胜态;
当石子异或和不为0,就是p状态啦;
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
int read(){
char c=getchar();
int f=1;
int x=0;
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int main(){
int t;
cin>>t;
while(t--){
int n;
n=read();
int p=read();
int ans=p;
for(int i=2;i<=n;i++){
int s=read();
ans^=s;
}
if(ans==0) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
}
洛谷评分提高+省选-,感觉不至于