Nim游戏改
为什么nim游戏这么多改编版本啊! こら!
给定n堆石子,第i堆石子有Ai个,两个人轮流取,每次可以选择至多k堆石子,对于选择的每一堆石子,取走某一正整数值的石子,试问先手必胜的条件
先说结论,当且仅当二进制下,在每一位上,都有在此位为1的个数是k+1的倍数时,先手必输
也可以等价地描述为:
定义a⊕b为k+1进制不进位的加法
那么先手必败,当且仅当⨁Ai=0
证明:
事实上,我们只要证明,除非已经处于必输状态,否则都存在一种取法,使先手将石堆取成必输状态
考虑满足该位为1的个数不是k+1的倍数的最高位m,并且满足该位为1的数的个数(模k+1后)为a
不难发现,对于在m位是1的石堆,其石子至少有2m个
这也就意味着,我们对于这些石堆,可以选择任取[1,2m]个
我们稍微考虑“减法”的影响,比如1610=100002,减去2后,变为1410=011102
这启示我们,当我们从一个数减去2i时,第i位以下的数字不会被改变,因此我们从第0位一直考虑到第m−1位
如果第0位有b(模k+1后)个数,并且b<a,那么我们从上述石堆随意挑选b个石堆,让它们先减1,否则让所有石堆减20
在经过上述变化后,假设第1位有c(模k+1后)个数,如果c<a,那么再随意挑选c个石堆,否则所有石堆减21
依次类推,直到第m位,这个时候,对于每个石堆,如果第m位仍为1,那么这个石堆减2m,否则不作为
这么一番操作之后,我们不难发现,所有位上的1的个数的最大值不会超过k−a个,并且我们还能选择k−a个数去修改它
这个时候再去考虑操作之后的最高位,进行同样的操作,如此下去,可以断言,我们可以将状态取成必输态
注意到上文对于nim游戏的本质没有什么触动
所以套用到一切sg函数的题上都可以
所以最终结论是:博弈论的题,先打表,再去想证明
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步