文章目录

  • 概述
  • Nim
    • 模型
    • 结论
    • 证明
  • anti-Nim
    • 模型
    • 结论
    • 证明
  • 运用
  • 后记

概述

Nim游戏是一种经典的博弈论模型。需要熟练掌握和运用。

Nim

模型

Nim游戏是指这样一种游戏:

有若干堆石子,两个玩家轮流进行操作。两个玩家公平操作,每次操作可以从任意一堆里取出任意个,但是不可以不取。当一个玩家无法进行操作时他输掉游戏。

结论

设每堆石子的个数分别为 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1​,x2​,...,xn​,设 X = x 1 X o r x 2 X o r . . . X o r x n X=x_1\;Xor\;x_2\;Xor\;...\;Xor\;x_n X=x1​Xorx2​Xor...Xorxn​,则若 X > 0 X>0 X>0则先手必胜, X = 0 X=0 X=0则后手必胜。其中 X o r Xor Xor是异或运算。

证明

游戏中有这两种状态:

  1. 异或和为0
  2. 异或和大于0

首先,一颗石子都没有是必败态,包含在状态1中。

假如现在处于状态1,要么当前玩家已经输掉比赛,要么他做任意操作使得状态1变为状态2。

考虑对于一个状态2,我们必然可以有一种取法,使得状态2变为状态1。取法如下:假设当前异或和为 X = x 1 X o r x 2 X o r . . . X o r x n X=x_1\;Xor\;x_2\;Xor\;...\;Xor\;x_n X=x1​Xorx2​Xor...Xorxn​对于 X X X在二进制下的最高位 k k k,必然至少有一个 x i x_i xi​这一位是1(反证法)。把 x i x_i xi​减小的过程可以看作先去掉 x i x_i xi​再加入一个 x n e w x_{new} xnew​,即原式变为 X X o r x i X o r x n e w = x 1 X o r x 2 X o r . . . X o r ( x i X o r x i ) X o r x n e w X o r . . . X o r x n X\;Xor\;x_i\;Xor\;x_{new}=x_1\;Xor\;x_2\;Xor\;...\;Xor\;(x_i\;Xor\;x_i)\;Xor\;x_{new}\;Xor\;...\;Xor\;x_n XXorxi​Xorxnew​=x1​Xorx2​Xor...Xor(xi​Xorxi​)Xorxnew​Xor...Xorxn​

因为要使 X X o r x i X o r x n e w = 0 X\;Xor\;x_i\;Xor\;x_{new}=0 XXorxi​Xorxnew​=0即 X X o r x i = x n e w X\;Xor\;x_i=x_{new} XXorxi​=xnew​, x n e w x_{new} xnew​在二进制下高于 k k k的位上和 x i x_i xi​相等,在第 k k k位上 x i x_i xi​是1而 x n e w x_{new} xnew​是0,所以 x n e w < x i x_{new}<x_i xnew​<xi​,取法可行。

由上可知,先手假如处在状态2,那么他只要每次都把状态2变成状态1,就可以必胜。反之,要是先手处在状态1,那他的对手每次也都可以经过操作再次让他处在状态1,所以必败。

anti-Nim

模型

操作和Nim游戏一样,唯一不同的地方是无法操作的人赢。

结论

先手必胜,当且仅当:

  1. 所有堆的石子数都为1,并且每堆的石子数异或和为0(偶数堆)
  2. 至少有1堆的石子数大于1,并且每堆的石子数异或和大于0。

证明

对于第一种情形,显然,每次一个人只能取掉一堆,那么堆数为偶数时对手就是取最后一颗石子的人,先手就赢了。

对于第二种,分为两种情况:

第一种,只有一堆石子数大于1,此时异或和必然大于0。考虑对这堆数量大于1的石子操作。假如剩下的只有1个的堆有奇数个,先手就取完这堆,剩下奇数个只有一堆的石子,留给对手的就是必败态了。假如剩下的只有1个的堆有偶数个,先手就把数量大于1的那堆取到只剩一个,留给对手的同样是必败态。所以这种状态必胜。

第二种,有至少两堆的石子数大于1。

设此时异或和为0的状态为“状态1”,大于0为“状态2”。

对于状态2,根据Nim游戏的证明,我们必然有一种取法使得取完之后异或和为0。然后稍微证明一下这样取只可能将状态2转移到状态1而不可能是其他情况:因为最多只能取完一堆,所以剩余的石子数大于1的堆至少有1堆,并且又因为只有1堆石子数量大于1的时候(即第一种情况)异或和为不可能为0,所以用这种方法取我们一定可以把状态2转换为状态1。

对于状态1,不管如何取,异或和必然大于0,所以留给对手的状态必然是状态2或者只有一堆石子数量大于1的状态。因为只有一堆石子数量大于1是对手的必胜态,而假如转移到状态2的话对手还可以将状态变回状态1,所以处在状态1的人必将留给对手只有1堆石子数大于1的情况。所以状态1是必败态。从而,状态2是必胜态。

证毕。

运用

任何一种游戏可以将状态看做点,转移看做边,而整个游戏就是一张图。一个状态的 S G SG SG函数是他的出边连向的所有状态的 S G SG SG值组成的集合的 m e x mex mex。感性理解就是一个状态的 S G ( u ) SG(u) SG(u)值为 x x x,那么他能经过一步转移达到一个 S G ( v ) ∈ [ 0 , x − 1 ] SG(v)\in[0,x-1] SG(v)∈[0,x−1]。

那么我们就能利用Nim游戏或者anti-Nim游戏的结论合并多个并列的游戏了。因为一个游戏的初始状态 S G SG SG值为 x x x,相当于一个石子数量为 x x x的堆。

正因为其与 S G SG SG函数的结合,所以Nim和anti-Nim的应用非常广泛。

后记

在此收藏一位大佬的博客,写的非常全面,还有其他各种博弈。clover_hxy

Nim和anti-Nim相关推荐

  1. Nim问题和阶梯Nim(staircase nim)

    Nim问题和阶梯Nim(staircase nim) Nim问题: 有若干堆石子,每堆石子的数量都是有限的,合法的移动是"选择一堆石子并拿走若干颗(不能不拿)",如果轮到某个人时所 ...

  2. LeetCode 292 Nim Game(Nim游戏)

    翻译 你正在和你的朋友们玩下面这个Nim游戏:桌子上有一堆石头,每次你从中去掉1-3个.谁消除掉最后一个石头即为赢家.你在取出石头的第一轮.你们中的每一个人都有着聪明的头脑和绝佳的策略.写一个函数来确 ...

  3. HDU 3032 Nim or not Nim?

    /* g(0)=0,g(1)=1. 状态2的后继有0,1和(1,1),它们的SG函数值分别是0,1和0, 所以g(2)=2.状态3的后继有0,1,2和(1,2),它们的SG函数 值分别是0,1,2和3 ...

  4. leetcode 292. Nim Game | 292. Nim 游戏(DP->数学推理)

    题目 https://leetcode-cn.com/problems/nim-game/ 题解 本题实际上是一个需要分析的数学题.如果第一时间没有发现规律的话,可以尝试先用递归法,暴力输出前几个,观 ...

  5. AcWing 892. 台阶-Nim游戏(nim博弈变种)

    题目链接 https://www.acwing.com/problem/content/description/894/ 思路 先说结论:我们将奇数位置上的石子数异或起来如果不为0则先手必胜 原理: ...

  6. AcWing 891. Nim游戏(nim博弈)

    题目链接 https://www.acwing.com/problem/content/893/ 思路 这个题目需要清楚一个概念: 必胜态:我们能通过一个操作使得局面变成必败态 必败态:无论如何操作都 ...

  7. 数学知识(基础数论)

    目录 质数 试除法判定质数 分解质因数 筛质数(线性筛) 约数 试除法求约数 约数个数 约数之和 最大公约数 欧拉函数 求欧拉函数 筛法求欧拉函数 快速幂 求快速幂 快速幂求逆元 扩展欧几里得算法 扩 ...

  8. 【BZOJ2819】Nim 树状数组+LCA

    [BZOJ2819]Nim Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可 ...

  9. 博弈——Nim博弈(hdu2176,1850,1851,1907,1849)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2176 http://acm.hdu.edu.cn/showproblem.php?pid=1850 ...

  10. Nim博弈和威佐夫博弈 Return of the Nim

    Nim博弈 Nim游戏的概述: 还记得这个游戏吗? 给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠,但不能在两列中取.最后拿光珍珠的人输. 后来,在一份资料上看到,这种游戏称为" ...

最新文章

  1. linux启动phpstudy,phpstudy启动不了解决方法
  2. python打飞机源代码-如何用 Python 打飞机 ?
  3. linux 压缩解压归档
  4. FileSystemObject (FSO)对象方法总结及应用
  5. java电子商务系统源码 Spring MVC+mybatis+spring cloud+spring boot+spring security
  6. 思科收购网络安全管理厂商Pari Networks
  7. 《天天数学》连载27:一月二十七日
  8. 系统架构与软件架构是一层含义吗
  9. python @staticmethod方法
  10. opencv学习笔记四十三:CamShift目标跟踪
  11. Java安装以后为什么打不开java打不开一闪而过如何解决
  12. 数商云DMS经销商管理系统解决方案:DMS系统实现业务全渠道、销售数据采集
  13. 【华为机试题 HJ22】汽水瓶
  14. 自然语言处理——基于预训练模型的方法——第1章 绪论
  15. [推荐]docker中文学习文档
  16. 售后的设计(退换货)
  17. 用51单片机(STC89C52RC、STC12C5A60S2、STC15W104)驱动MzLH03-12864液晶显示模块
  18. macbook 连接不上蓝牙鼠标 m585 m590 解决方法
  19. 当代最值得收藏的画家作品_「 中国当代最具收藏价值画家」——钟铃作品展...
  20. matlab死亡时间推测实验,尸检——关于死亡时间推测的基本手法及操作方式

热门文章

  1. 互联网摸鱼日报(2022-12-22)
  2. 第十三课 斗地主项目课③游戏音乐与音效及本地存储
  3. 计算机基础应用寒假作业,计算机基础寒假作业.doc
  4. 《Axure RP7网站和APP原型制作从入门到精通(60小时案例版)》一第2章 母版详解2.1 创建母版的两种方法...
  5. 融合边界处理机制的学习型麻雀搜索算法
  6. 数据结构 | 第十一章:二叉树和其他树 | 【前序遍历】【中序遍历】【后序遍历】【层次遍历】 | 并查集
  7. 一步一步教你写股票走势图——分时图二(自定义xy轴)
  8. 牛客SQL练习题笔记 -- 连接两次子查询返回表获取员工薪资涨幅
  9. Python实践|记账本
  10. python实现背景抠除_Python利用removebg模块批量抠图去背景