Processing math: 100%

Nim游戏改

为什么nim游戏这么多改编版本啊! こら!

给定n堆石子,第i堆石子有Ai个,两个人轮流取,每次可以选择至多k堆石子,对于选择的每一堆石子,取走某一正整数值的石子,试问先手必胜的条件


先说结论,当且仅当二进制下,在每一位上,都有在此位为1的个数是k+1的倍数时,先手必输


也可以等价地描述为:

定义abk+1进制不进位的加法

那么先手必败,当且仅当Ai=0


证明:

事实上,我们只要证明,除非已经处于必输状态,否则都存在一种取法,使先手将石堆取成必输状态

考虑满足该位为1的个数不是k+1的倍数的最高位m,并且满足该位为1的数的个数(模k+1后)为a

不难发现,对于在m位是1的石堆,其石子至少有2m

这也就意味着,我们对于这些石堆,可以选择任取[1,2m]

我们稍微考虑“减法”的影响,比如1610=100002,减去2后,变为1410=011102

这启示我们,当我们从一个数减去2i时,第i位以下的数字不会被改变,因此我们从第0位一直考虑到第m1

如果第0位有b(模k+1后)个数,并且b<a,那么我们从上述石堆随意挑选b个石堆,让它们先减1,否则让所有石堆减20

在经过上述变化后,假设第1位有c(模k+1后)个数,如果c<a,那么再随意挑选c个石堆,否则所有石堆减21

依次类推,直到第m位,这个时候,对于每个石堆,如果第m位仍为1,那么这个石堆减2m,否则不作为

这么一番操作之后,我们不难发现,所有位上的1的个数的最大值不会超过ka个,并且我们还能选择ka个数去修改它

这个时候再去考虑操作之后的最高位,进行同样的操作,如此下去,可以断言,我们可以将状态取成必输态


注意到上文对于nim游戏的本质没有什么触动

所以套用到一切sg函数的题上都可以


所以最终结论是:博弈论的题,先打表,再去想证明

posted @   remoon  阅读(145)  评论(1编辑  收藏  举报
点击右上角即可分享
微信分享提示