可惜没如果=_=
时光的河入海流

看了很多的博客,终于对Nim游戏中的异或操作有些认识。。。

首先对于Nim游戏,需要明确两点,一点是如果剩下全是0,则是必败态。一点是如果有两个完全相同的状态,则它们合起来的状态是一个必胜态,即后手能完全模仿先手在对称的堆中进行操作。这就可以通过异或来操作

对于本题最简单的Nim游戏,只要最后的异或和为0就一定是必败态,因为我们看每一位上1的个数都是偶数位,因此我们只要对某个数中的1进行操作了,后手就能作出操作使所有数的异或和再次变成0,使先手总是保持必败的状态。

因此在本题中,只要异或和不为0就是必胜态,只要异或和为0就是必败态。

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 int n,ans,t;
 4 int main(){
 5     int i,j;ans=0;
 6     scanf("%d",&t);
 7     while (t--){
 8         scanf("%d",&n);
 9         ans^=n;
10     }
11     if (ans) printf("Yes\n");
12     else printf("No\n");
13     return 0;
14 }

 

posted on 2022-07-23 03:27  珍珠鸟  阅读(38)  评论(0编辑  收藏  举报