文章目录

  • 概述
  • 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. java中JVM内存管理(1)
  2. VC+ADO+Access2000数据库文件密码的设置和修改
  3. 【华为云技术分享】#探索鲲鹏#之“在鲲鹏上使用编程语言——C语言
  4. 大数据可视化面临哪些挑战
  5. 面试题|集合ArrayList list = new ArrayList(20) 中的list扩充几次?
  6. Python3入门机器学习经典算法与应用 第3章 更多相关操作
  7. 拟人拟物法求解不等圆Packing问题
  8. 最新中国上市公司市值500强(2021年)
  9. 诚之和:谁在抢救瑞幸咖啡?
  10. Roy Li:币市里,我相信社区的力量和草根的崛起
  11. SpringBoot+Vue实现简单用户管理平台第一篇(后端接口设计)
  12. 电线电缆很烫,都有哪些原因
  13. 第三届VueConf将于2019年6月8日在上海举行 转发评论送门票
  14. 玉米社:竞价推广的常见误区有哪些?
  15. Coin Change
  16. 迄今最全的国内引进的凯迪克获奖绘本书单172本(1938年-2016年)
  17. Win10蓝屏win32k power watchdog timeout 蓝屏代码0x0000019C
  18. CSS - 实现Loading加载动画
  19. LINUXftp文件共享服务
  20. 一些常用的batch命令

热门文章

  1. 渗透之——Metasploit渗透BSPlayer V2.68
  2. 思科交换机实现管理口访问设置+远程登录(一)
  3. 4G物联网设备使用经验--深刻的教训
  4. IB中文课程介绍:语文的另一种可能
  5. 2019构建餐饮私域流量池,餐饮商家别错过了这个风口,私域流量攻略完整方案!...
  6. 怎么用xshell启动mysql_xshell怎么配置mysql
  7. 【go项目-geecache】动手写分布式缓存 - day7 - 使用 Protobuf 通信
  8. Pytorch CNN 手写数字识别 0-9
  9. outlook邮件服务器保存设置,邮件Outlook设置本地存储的方法--
  10. 如何才能成为期货市场的天才猎杀者?