Nim游戏改

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

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


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


也可以等价地描述为:

定义\(a \oplus b\)\(k+1\)进制不进位的加法

那么先手必败,当且仅当\(\bigoplus A_i = 0\)


证明:

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

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

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

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

我们稍微考虑“减法”的影响,比如\(16_{10} = 10000_{2}\),减去\(2\)后,变为\(14_{10} = 01110_{2}\)

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

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

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

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

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

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


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

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


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

posted @ 2020-10-17 21:57  remoon  阅读(143)  评论(1编辑  收藏  举报