XCPC博弈论大赏

首要结论:

一:Nim游戏,必败局面为异或和等于0。
证明:
1.已知终止状态为所有石子数都为零,异或和也为零。
2.考虑任意一个异或和非零(设为x)的状态,设其最高位的1(设为第k位)由a_i取得,因此总可以从a_i上减去一些石子,使得最高位的1变为0,其余位置调整为0。具体怎么取,两边异或上a_i,得异或和为xa_i。将a_i改为xa_i即可。(因为高于k位的同a_i,第k位小于a_i,所以x^a_i<a_i。因此任意一个非零状态总可以转化为零状态。
3.考虑任意一个零状态,假设能将某个a_i改为x,从而使异或和再次为零,两边先异或上a_i,表示a_i减去a_i,再异或上x,表示加上x,从而右侧的值为x^a_i=0,x=a_i,矛盾。所以任意一个零状态都不能转化为零状态。
综上结论得证。
二:SG函数。
定义局面的SG值为当前局面能够到达的局面的SG值的mex。(暂时没有想到普适的除暴力以外的求SG值的方法)。
多个游戏的SG值为单个游戏SG值的异或和。
SG值为0时,局面必败,否则必胜。
Nim游戏中某一堆石子的SG函数即为石子数。
运用:
一般来说,做题或者是要看出所用的模型,往nim及nim的变式上套,或者是打SG函数的表来找规律。

NIM游戏的变式:

我尝试尽量使用SG函数及nim模型来解释每一个NIM游戏变式的做法。
1.(巴什博弈)
题意:
取石子数限制为小于等于m。
解法:
推得SG函数为x%(m+1)。
2.(斐波那契博弈)
题意:
第一步可以取任意个石子,但不能取完,后面一次取的石子数不能超过前一次的两倍。
解法:
通过打表SG[i][j]意为当前有i个石子,当前取掉j个石子的SG值,然后取mex(SG[N][1],SG[N][2]……SG[N][N-1])可得初始有n个石子时的SG值,可以发现,当n为斐波那契数时,SG=0。
3.(阶梯nim)
题意:
每一个阶梯上有一些石子,每次将一堆的若干个石子往下一个阶梯移动,都移到第0个阶梯的玩家胜。
解法:
这道题从本质出发,可以发现偶数阶梯的石子根本没用,因为先手动多少,后手就同样动多少,直到0阶梯。而奇数堆的只要移动就会变为偶数阶梯中而无用,因此就可以转化为普通nim。
4.
题意:
每次可以从至多k堆石子中取数。
解法:每一位1的个数%(k+1)作为该位的sg。
5.(anti_nim):
题意:
取最后一颗石子输。
解法:
考虑单堆的anti_nim问题,sg值只有在1的时候有变化为0,其余的sg值不变,因此可以直接手动将1删去(每次删去会转化一次正负值),在剩下的石子中作普通nim。(还有一种可能的方法:钦定一个堆为anti_nim堆,其余堆为普通nim堆,作nim和,把每个堆都钦定一遍,看能不能使nim和不为0)。
6.(take&break)
题意:
取一堆石子,可以分成规模较小的两堆石子。
解法:
暴力dp。
7.(翻硬币问题)
题意:每次将一个正面的硬币翻成反面,并可以选择将左侧的一个硬币翻转 。
解法:
将硬币的序号看作是sg值,只统计正面朝上的sg值。
(如果题目改成可以任意将前面连续若干个硬币翻转,则sg值为lowbit(i))
8.(树上删边问题)
题意:一棵树,每次将一条边删去,与根不连通的删去,直至剩下根。
解法:将一条长度为k的链看作是一堆k个石子,然后树形dp合并链即可。
9.(无向图删边问题)
题意:不再是树。
解法:将偶环缩为一个点,将奇环缩为一个点加一条边。
10.(every_nim)
题意:每一个子游戏都需要作决策。
解法:引入步数,对于必胜的游戏,尽可能使步数提升,对于必败的游戏,尽可能使步数减少。
11.
题意:每次只能从某一端开始取。
解法:稍微用手推一推就会发现,一堆的数量若大于二,该整堆的sg值必不为0,而如果堆的石子数为1,则需要特殊考虑,时间复杂度(O(N)).

威佐夫博弈

这一类博弈问题与nim所用的方法完全不同,这一类问题涉及的数学知识比较多,暂时没有充分理解。

不平等博弈

经典例题

1.扩展威佐夫博弈
在普通威佐夫博弈的基础上对其进行条件的放松,如果从两堆中同时取数,取的石子数的差小于等于k,当k=0时为普通威佐夫博弈。
为了更加地适应赛场上的做法,这里对于扩展威佐夫博弈的解决使用打表找规律的方法。
先考虑普通的威佐夫博弈的奇异局面的数列:
x:0,1,3,4,6,7,9,10,12
(beatty定理,beatty序列)
2.P3185
每次只能取一颗石子,并在另外两个右侧的堆各加一个石子。
将操作转化为转化为(test&break)问题。
3.阶梯nim变种
这是一个经典的阶梯nim变种问题,需要记牢。
从右往左,将两个空格之间的棋子数看作是一堆的石子数,移到最右端说明是到达第0堆。
然后直接套阶梯nim的公式即可。
4.二维翻硬币问题
解法:首先对于第一行和第一列,可以用上面的公式直接得到sg值,对于其他的位置(i,j),在图上模拟模拟可以得到sg值为2^(i+j-2)。然后对所有反面的硬币sg值异或即可。
5.双端取石子问题

2021.5.9这个博客是1个多月前刚打完昆明站写的,后来发现这样的博客有点浪费时间就不往下写了,现在全程题海战术,发出来算是说明一下这些日子以来的学习情况。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值