关于sg函数的一些证明
复习csp2019的时候稍微看了看博弈论,发现自己对于sg函数的理解完全不到位
有些定义甚至想都没想过
于是就口胡了一篇blog来安慰虚弱的自己
Question 1
对于一个满足拓扑性质的公平组合游戏
若定义一个函数\(f\),\(f(P状态)=0\)
假设当前状态为\(a\),它对局面的定义合法
那么\(f=sg\)
可以发现,它就是\(Muti-sg\)问题的核心,接下来我们希望证明这个问题的正确性
首先,先弄清几个定义
对于后继
- 指的是一步转移到的状态
- 后继一定不会等于当前状态
对于局面
它满足以下的性质(当然,性质的名字是我自己取的)
- 状态性:它本身也可以是一个状态
- 后继性:局面本身是状态的后继,或是后继的后继,等等
- 异或可行性:即\(f(a)\)是\(a\)所包含的所有局面\(f\)值的异或和
- 唯一改变性:后继与状态本身仅改变了一个局面,
当然事实并不是如此,如果你会k异或的话,但我们不做探究 - 单向变化性:局面只会改变成为它的后继(如果它是一个状态)
证明
\(f=sg\) 等价于任意\(a\)满足,\(f(a)\)是\(mex\{f(a的后继)\}\)
因为状态之间的关系本质上是一个\(DAG\)(即满足拓扑性),所以可以通过归纳法来证明
假设一个状态\(a\),它的所有后继(包括后继的后继)的\(f\)值都等于\(sg\)值
假设\(a\)可以分为局面\(b_1\)~\(b_n\),对应\(f_1\)~\(f_n\),它们等于\(sg_1\)~\(sg_n\)
所以\(f(a)=f_1\oplus f_2\oplus . ..\oplus f_n=sg_1\oplus sg_2\oplus . ..\oplus sg_n\)
如果\(a\)有一个后继\(c\),考虑\(f(c)=f(a)\oplus sg_i \oplus sg_x\),也就是把\(b_i\)这个局面改成了\(x\)局面
考虑\(f(c)\)可以取哪些值?
首先,因为\(sg_i \ne sg_x\),所以\(f(c) \ne f(a)\)
接下来证明\(f(c)\)可以取到\(0\)~\(f(a)-1\)的所有数
对于一个值\(val\in[0,f(a)-1]\)
设\(k\),满足\(val=f(a) \oplus k\)
因为\(val<f(a)\),考虑\(val\)的最高的和\(f(a)\)不同的一位,这一位必然存在并且在这一位上\(f(a)\)是\(1\),\(val\)是\(0\)
这一位同时也是\(k\)的最高位
那么必然存在一个\(sg_i\)满足它的这位是\(1\),而对应的\(sg_x\)必然会小于\(sg_i\),因为它的这位是\(0\)
所以存在满足条件的\(x\)且它是\(b_i\)的后继
所以这样的\(k\)可以通过\(sg_i \oplus sg_x\)构造得到
Question 2
翻硬币游戏
定义,有一些硬币排成一排,两人采用最优策略,每次可以翻动其中一些硬币(正变反,反变正),保证翻的硬币中最右边的硬币只能是从正翻到反,不能翻动者输
结论
每个状态的\(sg\)值等于当前所有为正面的硬币在序列中单独存在的状态的\(sg\)值的异或和
证明
设正面为\(1\),反面为\(0\)
'...'
表示状态,...
表示局面
把一个状态的\(01\)串倒过来,即'00101'
变成\(10100\),把它看成一个二进制数,那么在游戏过程中这个数字递减
所以这个游戏是满足拓扑性质的
接下来我们设一个定义域为\(01\)串的函数\(f\)
- \(f(00...0)=0\)
- \(f(00...01)=sg(00...01)\)
- \(f(一个01串)=\bigoplus_{每一个1} f(000..01)\)
- 其中对于第\(i\)个\(1\),前面有\(i-1\)个\(0\)
假设当前状态为'011001'
\(f(011001)=f(01)\oplus f(001)\oplus f(000001)\)
'011001'
有这样一个后继'010100'
可以说\(f(010100)=f(01)\oplus f(0001)=f(011001)\oplus f(0011)\oplus f(000001)\)
我们把\(01\),\(001\),\(000001\)看成是'011001'
的三个特殊的局面
那么'010100'
可以分拆成\(01\),\(001\),\(0011\)三个局面,尽管它们显得不那么特殊
这样的局面划分是合法的,因为可以看成是\(000001\)变成了\(0011\)这个局面,它满足异或和的性质
而很显然的是'0011'
('001100'
)确实是'000001'
的一个后继
因为\(f\)满足这样的性质:
- \(状态f(P状态)=0\)
- 对于局面的定义合法
在此之前,我们已经证明了,对于这样的\(f\),\(f=sg\)
完结撒花★,°:.☆( ̄▽ ̄)/$:.°★ 。
Blog来自PaperCloud,未经允许,请勿转载,TKS!
关于sg函数的一些证明的更多相关文章
- 博弈论(nim游戏,SG函数)
说到自己,就是个笑话.思考问题从不清晰,sg函数的问题证明方法就在眼前可却要弃掉.不过自己理解的也并不透彻,做题也不太行.耳边时不时会想起alf的:"行不行!" 基本的小概念 这里 ...
- 【转】博弈—SG函数
转自:http://chensmiles.blog.163.com/blog/static/12146399120104644141326/ http://blog.csdn.net/xiaofeng ...
- sg函数与博弈论
这个标题是不是看起来很厉害呢... 我们首先来看一个最简单的游戏.比如我现在有一堆石子,有p个,每次可以取走若干个(不能不取),不能取的人就输了. 现在假设有两个人要玩这个游戏,一个人先手,一个人后手 ...
- SG函数 专题练习
[hdu1536][poj2960]S-Nim 题意 题意就是给出一个数组h,为每次可以取石子的数目. 然后给你n堆石子每堆si.求解先手能不能赢? 分析 根据\(h\)数组预处理出\(sg[i]\) ...
- 【转】博弈问题及SG函数(真的很经典)
博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要 ...
- SG函数
入门一: 首先来玩个游戏,引用杭电课件上的: (1) 玩家:2人:(2) 道具:23张扑克牌:(3) 规则:游戏双方轮流取牌:每人每次仅限于取1张.2张或3张牌:扑克牌取光,则游戏结束:最后取牌的一方 ...
- (转)博弈问题与SG函数
博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要 ...
- Nim 博弈和 sg 函数
sg 函数 参考 通俗易懂 论文 几类经典的博弈问题 阶梯博弈: 只考虑奇数号楼梯Nim,若偶数楼梯只作容器,那么游戏变为Nim.题目 翻转硬币: 局面的SG值为局面中每个正面朝上的棋子单一存在时的S ...
- SG 函数 S-Nim
http://poj.org/problem?id=2960 S-Nim Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 34 ...
随机推荐
- 项目Gradle版本从4.4升级到4.6
一.背景 Gralde版本与AGP(Android Gradle Plugin)版本具有一定的对应关系,原因在于AGP实质上作为Gradle的插件,依赖于Gradle作为宿主.因此,不同的AGP版本需 ...
- 【3】hexo+github搭建个人博客的主题配置
更换博客主题 主题可参考:https://hexo.io/themes/ hexo默认主题:Landscape 示例主题:Next 下载Next主题 进入Blog所在目录,输入下载命令 #进入Blog ...
- oracle 自增序列实现 可作为主键
好记性不如烂笔头 记录如何建立oracle 自增序列 表结构 create table TAB_USERINPUT ( RID VARCHAR2(20) not null, VARID VARCHAR ...
- Asp.Net Core中使用NLog记录日志
2019/10/28, Asp.Net Core 3.0, NLog 4.6.7, NLog.Web.AspNetCore 4.9.0 摘要:NLog在asp.net网站中的使用,NLog日志写入数据 ...
- PIE SDK矢量栅格化算法
1.算法功能简介 矢量栅格化,由矢量数据向栅格数据的转换一般比较方便.对于点.线目标,由其所在的栅格行.列数表示,对于面状目标,则需判定落人该面积内的像元.通常栅格(像元)尺寸均大于原来坐标表示的分辨 ...
- babel plugin和presets是什么,怎么用?
https://www.fullstackreact.com/articles/what-are-babel-plugins-and-presets/ 当开发react或者vuejs app时,开发者 ...
- 【python+selenium学习】常见错误: 'gbk' codec can't decode byte 0xb0 in position 30
最近编写的自动化脚本,数据部分使用到了从配置文件中取,即自定义config.ini,但是在读取配置文件的时候却报错了'gbk' codec can't decode byte 0xb0 in posi ...
- flink Iterate迭代基本概念
基本概念:在流中创建“反馈(feedback)”循环,通过将一个算子的输出重定向到某个先前的算子.这对于定义不断更新模型的算法特别有用. 迭代的数据流向:DataStream → IterativeS ...
- loadrunner 基本操作
1.录制(录制选项) 2.回放(运行时设置) 3.添加事物 4.参数化 5.内容检查 6.添加集合点 1.在脚本中添加集合点函数如下: lr_rendezvous("集合点") / ...
- 【爬虫】网页抓包工具--Fiddler--Request和Response
[爬虫]网页抓包工具--Fiddler Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888, ...