对于SG函数的理解

来源:互联网 发布:自动答题软件 编辑:程序博客网 时间:2024/05/22 04:32

  首先是NIM游戏:N堆石子,两个人轮流拿,可以拿一堆或者一堆中的一部分,最后谁不能操作谁就输了。

  NIM和就是把每堆都看成单独的游戏,N堆的结果是每堆结果的异或。

  百度百科上的证明:

根据定义,证明一种判断position的性质的方法的正确性,只需证明三个命题: 1、这个判断将所有terminal position判为P-position;2、根据这个判断被判为N-position的局面一定可以移动到某个P-position;3、根据这个判断被判为P-position的局面无法移动到某个P-position。
第一个命题显然,terminal position只有一个,就是全0,异或仍然是0。
第二个命题,对于某个局面(a1,a2,...,an),若a1^a2^...^an<>0,一定存在某个合法的移动,将ai改变成ai'后满足a1^a2^...^ai'^...^an=0。不妨设a1^a2^...^an=k,则一定存在某个ai,它的二进制表示在k的最高位上是1(否则k的最高位那个1是怎么得到的)。这时ai^k<ai一定成立。则我们可以将ai改变成ai'=ai^k,此时a1^a2^...^ai'^...^an=a1^a2^...^an^k=0。
第三个命题,对于某个局面(a1,a2,...,an),若a1^a2^...^an=0,一定不存在某个合法的移动,将ai改变成ai'后满足a1^a2^...^ai'^...^an=0。因为异或运算满足消去率,由a1^a2^...^an=a1^a2^...^ai'^...^an可以得到ai=ai'。所以将ai改变成ai'不是一个合法的移动。证毕。

  SG函数是子状态SG值从0开始最小的没有出现的值,如果没有子状态自然SG是0,是必败态。

  如果当前状态由几个部分组成,那么SG等于这几个部分SG的异或值。就和NIM游戏一样,如果每堆有x个石子,那么这一堆的SG值就是x,N堆的SG就是每堆SG的异或。

  为什么SG的值和NIM和是一样的呢?我想的是如果当前SG值为x,那么它可以到达值小于x的任何子状态,就和拿石子是一样的。但是也有可能到达比x更大的SG的子状态,但是就算一个人到达了这个SG更大的状态,第二个人又可以把SG变回原来的值,是不影响的。游戏总会结束,总有一个SG是x的地方不能到达更大的SG。

  做了几个题,有些要枚举子状态,有些是先预处理单个的情况,然后把总状态看成单个的NIM和。

0 0
原创粉丝点击