P2197 nim游戏

话说它是(简单?)博弈论的基础的说?

这道模板还是很好打的,只要把所有数异或起来,ans如果为0就是必败局面,否则是必胜局面。

知道这个结论就很好打出来了啦!!

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     int T;
 5     cin>>T;
 6     while(T--){
 7         int n,ans=0;
 8         cin>>n;
 9         for(int i=1,digit;i<=n;i++){
10             cin>>digit;
11             ans^=digit;
12         }
13         if(!ans) cout<<"No";
14         else cout<<"Yes";
15         cout<<endl;
16     }
17 }
View Code

但我知道这肯定不是关键?

ヾ(o・ω・)ノ

是——怎么证明的说!!!

首先我们要了解nim的本质。

Nim游戏是博弈论中最经典的模型(之一),它又有着十分简单的规则和无比优美的结论 (我知道)Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG)。

第二个问题随之而出:ICG -> 1.两人;.

              2.交替移动;

              3.任意操作与以前无强制关系(为了最有可能会改变)

              4.最后无法移动为负。

 通常的Nim游戏的定义是这样的:有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。

目的是任何一方会在最开始出现必胜策略的时候遵循必胜策略。

那么(๑>ڡ<)✿ 什么是必胜策略?

定义:P-position(Previous)与N-position(Next)局面与无法进行任何移动的局面(也就是terminal position),遵循:

  1. 初始定义无法进行任何移动的局面为P(即最后一步),这样可以很好理解P是上一步操作的必胜局面。对于这一步的属于先手必败。(可向外拓展)
  2. 可以移动到P的局面是N局面,遵循这个原则就可以保证先手必胜。
  3. 所有只能导致N局面的局面是N局面,即指你走的这一步会导致下一操作者必胜。
按照定义,每一个局面都是N/P局面的一种。 按照从后向前递推或者拓扑论思想感性理解。

Nim游戏结论

(Bouton's Theorem)对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示异或(xor)运算。

(雾)完全没有道理的和异或运算扯上了关系。(基本上就是按照两种position的证明来的。)

Nim游戏证明

  1. 这个判断将所有terminal position判为P-position;(废话) 全是0,异或——;
  2. 根据此判断,判为N-position的局面一定可以通过合法移动移动到某个P-position.即

     那么此时一定可以一步有

正确性:

 

    3. 对于任意定义的P-position,一定不存在 一个合法移动移动到某个P-position。

正确性:因为异或求和满足消去律,那么这不合法。

 

证毕

根据这个定理,我们可以在O(n)的时间内判断一个Nim的局面的性质,且如果它是N-position,也可以在O(n)的时间内找到所有的必胜策略。Nim问题就这样基本上完美的解决了。
 
原文地址:https://www.cnblogs.com/btcadmire123A/p/11253066.html