给定n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。
问如果两人都采用最优策略,先手是否必胜。
输入格式
第一行包含整数n。
第二行包含n个数字,其中第 i 个数字表示第 i 堆石子的数量。
输出格式
如果先手方必胜,则输出“Yes”。
否则,输出“No”。
数据范围
1≤n≤10^5,
1≤每堆石子数≤10^9
输入样例:
2
2 3
输出样例:
Yes
1. 如果每一堆都是0的话,就是一个必败态(因为他没法拿石子了) 所谓必败态就是这种状态轮到给谁,谁就必败。
2. 如果是一个必胜态,那么一定可以通过从一堆中拿取一定的石子从而将必胜态转为必态并将此必败态移交给对手.
3,如果是一个必败态,无论怎么操作之后必败态都将转化成必胜态并且将此必胜态转给对手。
4. 因此如果最开始的时候是必胜态那么先手必胜 如果最开始的时候是必败态那么先手必败
5. 必胜态是指石子数量异或不为0 必败态是指石子数量异或为0
#include<iostream>
using namespace std;
int main(){
int n;
int res = 0;
int c;
cin>>n;
while(n--){
scanf("%d",&c);
res = res ^ c;
}
if (res == 0)
puts("No");
else puts("Yes");
return 0;
}