Nim游戏改

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

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


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


也可以等价地描述为:

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

那么先手必败,当且仅当(igoplus 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)个数去修改它

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


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

原文地址:https://www.cnblogs.com/reverymoon/p/13832778.html