zoukankan      html  css  js  c++  java
  • 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)个数去修改它

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


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

  • 相关阅读:
    OAuth2 协议原理简析及Azure AD OAuth2示例
    MySQL Innodb MVCC(多版本并发控制)
    乐观锁和悲观锁
    数据库索引
    SQL盲注
    JAVA array to list and list to array
    缓存穿透,缓存雪崩和缓存击穿
    四、Spring Cloud 之旅 -- Ribbon 负载均衡
    JavaScript中 require、import 有什么区别?
    vue 2.x Vue 3.x 日常采坑之 设置alias别名、background引入图片、全局引入scss文件 的问题
  • 原文地址:https://www.cnblogs.com/reverymoon/p/13832778.html
Copyright © 2011-2022 走看看