「数学::博弈论」Nim游戏(尼姆游戏)/ Luogu P2197(C++)

博弈论经典问题Nim问题 <br /> <br />博弈论经典问题,Nim游戏是一个典型的组合游戏问题,很多游戏问题都可以规约到Nim游戏问题。Nim游戏问题是一个ICG(Impartial Combinatorial Games)问题;<br />ICG问题的特征是:<br />1.两个人参与,交替走棋;<br />2.可能的走法在一个有限的集合里选取;<br />3.游戏局面无后效性,未来与过去无关;<br />4.如果某选手无法走动,则判负;<br />Nim的理论<br />游戏状态只分两种:当前先手必胜,当前先手必败;前者 阅读详情

目录

概述

思路

解题过程

Code

复杂度

总结


 

概述

Luogu P2197:

甲,乙两个人玩 nim 取石子游戏。

nim 游戏的规则是这样的:地上有 n 堆石子(每堆石子数量小于 104),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。假如甲是先手,且告诉你这 n 堆石子的数量,他想知道是否存在先手必胜的策略。

输入格式

本题有多组测试数据。

第一行一个整数 T (T≤10),表示有 T 组数据

接下来每两行是一组数据,第一行一个整数 n,表示有 n 堆石子,n≤104。

第二行有 n 个数,表示每一堆石子的数量.

输出格式

共 T 行,每行表示如果对于这组数据存在先手必胜策略则输出 Yes,否则输出 No。

输入输出样例

输入 #1

2
2
1 1
2
1 0

输出 #1

No
Yes

博弈论属于运筹学领域的一个关键分支,我们先来简单了解一下其基本要素:

我们要假设参与博弈的双方都是神,无所不知,可以瞬间推导出每次行动后直到博弈结束的所有可能局面,他们在每轮博弈中作出以下行为:

  • 最佳回应(Best response):依据对手的行动,选择能带来最高收益的行动。
  • 占优策略(Dominant strategy):无论对手采取何种策略,该策略始终是最佳选择。
  • 纳什均衡(Nash equilibrium):在这种状态下,玩家们的策略达到均衡,即双方都采取了对自己最优的决策。

是谓“泰山崩于前而色不变,麋鹿兴于左而目不瞬,然后可以制利害,可以待敌。”

结合题目,那么我们来想一想这个事。


思路

双方会永远向着对自己最有利的方向拿取石子,双方的博弈是一个无所不知的过程,他们知道此次行为后的所有局面,可惜我们是凡人,不能推演所有的情况,所以我们需要来找规律。

已知:

  • 有初态第i堆石子的个数为a[i] > 0。
  • 有末态所有堆石子个数a[i] = 0,这是某个人输的状态。

在末态,a[i] = 0。(,即XOR异或和,意为a[0]^a[1]^...^a[n - 1])。

在末态的前一个状态,存在一个a[i] ≠ 0,即 a[i] ≠ 0:这对于把当前态操作到末态的人来说是必胜态,随后,他把末态丢给另一个人,即末态对于另一个人是必输态。

这或许是一个有用的性质,即我们可以对异或和做一些文章。

我们来证明两个神奇妙妙性质:

  1. 当前状态:a[i] ≠ 0,则至少存在下一个状态使得a[i] = 0。
  2. 当前状态:a[i] = 0,且a[i]不全为0,则下一个状态必是a[i] ≠ 0。

1.证明:{

        设当前状态a[i] = a[0]^a[1]^...^a[x]^...^a[n - 1] = s ≠ 0。

        设s的二进制最高位1为第k位,则必有奇数个a的k位是1,这些奇数石头堆里选一堆a[x],a[x] ^ s < a[x],(a[x] = xxx1xxx, s = 0001xxx, a[x] ^ s = xxx0xxx < a[x])

        从a[x]拿走一些石头使得剩余石头数目变为a[x] ^ s,则下一个状态:

        a[i] = a[0]^a[1]^...^a[x] ^ s ^...^a[n - 1]

                   = a[0]^a[1]^...^a[x] ^...^a[n - 1] ^ s (异或运算满足交换律)

                   = s ^ s 

                   = 0

                  得证。

}

2.证明{

        设当前状态a[i] = a[0]^a[1]^...^a[x]^...^a[n - 1] =  0,且a[i]不全为0。

        则在每个二进制位上,所有a加起来有偶数个1,随便找一堆石头,再随便拿几个,其二进制1的数目一定发生变化,使得下一个状态a[i] ≠ 0。

}


解题过程

有了这两个性质,先手就可以逼死后手。

如果甲先手,且初态a[i] ≠ 0,他就可以构造下个状态a[i] = 0甩给对手,乙只能构造再下个状态a[i] ≠ 0回给甲,二者交替,最后一次甲构造所有a[i] = 0绝杀乙。

二者都是神,甲永远找到构造路径踢死乙,由于a[i] = 0只能构造出a[i] ≠ 0,乙永远无力回天。

因此,甲能否获胜在一开始就决定了:胜利条件是甲先手且初态a[i] ≠ 0。


Code

#include <bits/stdc++.h>
using namespace std;
const char* solve(int n){
    int res = 0;
    while(n--){
        int a; cin >> a;
        res ^= a;
    }
    return res ? "Yes\n" : "No\n";
}
int main(){
    int T; cin >> T;
    while(T--){
        int n; cin >> n;
        cout << solve(n);
    }
    return 0;
}

复杂度

时间复杂度: O(n) 。

空间复杂度: O(1) //不储存数组,即刻输入输出。


总结

主播主播,Nim游戏还是太吃操作了,有没有更简单的解?有的兄弟,博弈论问题存在一类通解:SG函数,我们将在未来进行讲解。

 

三种经典博弈(取石子问题) 博弈是有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。 阅读详情

相关推荐

超越数据手册:深入Zynq XADC的DRP接口与PL端自定义采样逻辑

本文深入探讨Zynq-7000系列XADC模块的DRP接口机制与PL端自定义采样逻辑实现。通过硬件级多通道轮询、触发采样和实时校准技术,突破传统软件驱动限制,为高精度电压测量和通讯应用提供极致灵活性和响应速度。

xxx12的博客 770

Nim博弈问题

本题见过你就会,没见过是不会的 提示:Nim博弈问题的来源也是很残酷的 Nim博弈问题诞生于1840年之后,中国遭受世界各地强国的蹂躏,然后抓了很多奴隶去美国,跟当年的非洲三角贸易一样; 中国的奴隶在广州上船之后,去美国航行需要3个月,这时候实在是太无聊了,于是奴里们就想到了一个游戏,当时大家手里只有硬币 ,于是规定玩一个游戏: 从0–N-1位置放硬币,每个位置可以放很多硬币,俩人玩,分为先手与后手; 所谓先手,就是你先拿,选一个位置随意拿多少个都行 所谓后手,就是你后拿,选一个位置随意拿多少个都行 wi

weixin_46838716的博客 861

【气动弹性实战】基于Nastran与Patran的机翼颤振仿真:从模态分析到临界速度预测

本文详细介绍了基于Nastran与Patran的机翼颤振仿真全流程,从气动弹性问题解析、机翼建模技巧到模态分析与临界速度预测。通过实战案例展示如何利用SOL 145求解器进行颤振分析,并分享网格划分、材料属性设置等工程经验,帮助工程师有效解决飞行器设计中的气动弹性耦合问题。

weixin_33725722的博客 597

Nim问题 不想出差的HR

[编程题]不想出差的HR 按照卡中心校园招聘的要求,HR小招和小商需要从三个科室中(分别为A、B、C)抽派面试官去往不同城市。 两名HR按照以下规定轮流从任一科室选择面试官:每次至少选择一位,至多选择该科室剩余面试官数。最先选不到面试官的HR需要自己出差。 假设HR小招和小商都不想出差且每次选择都采取最优策略,如果是小招先选,写一个函数来判断她是否需要出差。如果不需要出差,请给出第一步的最优策略。...

a1428606644的博客 1040

Android Display Graphics #1 整体框架介绍一

手机屏上显示的内容,2D或3D ,如果是 3D 的,不管是 App 还是游戏,或者简单的图片界面,底层都是通过 GPU、 通过 OpenGL(ES)绘制出来的。是Java层的一个类,提供了一系列API,使用这些API可以实现各种的产品经理要求的效果。显示的不同阶段对这块内存的叫法不同,在上层可以是Window、ANnativeWindow、Surface、SurfaceView、layer、buffer,这些本质上没啥区别,可以广泛意义上理解为用于显示内容的那块内存,只不过各个阶段的操作接口不同。

oDwyane03的博客 1387

UWB定位进阶:如何利用DW1000的CIR数据做NLOS信号识别?

本文深入探讨了如何利用DW1000芯片的信道脉冲响应(CIR)数据进行非视距(NLOS)信号识别,以提升UWB定位精度。通过分析CIR数据的核心价值、预处理方法、特征提取技术以及机器学习模型构建,为研究人员和工程师提供了实用的解决方案,帮助克服室内定位中的NLOS挑战。

weixin_28729205的博客 474

创造课堂之经典博弈游戏(Game)

博弈理论是研究决策者之间相互作用的数学和逻辑理论。在博弈理论中,决策者被称为“玩家”,他们通过制定策略来最大化自身利益。

nihaoakekeke的博客 2327

Ollama模型路径迁移实战:Windows/Mac/Linux三平台保姆级教程(附常见问题排查)

本文提供了一份详细的Ollama模型路径迁移教程,涵盖Windows、macOS和Linux三大平台。通过设置OLLAMA_MODELS环境变量或创建符号链接,指导用户将模型从默认路径安全迁移至新位置,以释放系统盘空间或提升性能。教程包含迁移前的准备、分平台步骤、迁移后的验证以及常见问题排查,确保迁移过程平滑可靠。

js777的博客 1184

数学知识——博弈论(巴什博奕、尼姆博奕、威佐夫博奕)思路及例题

争先恐后地博弈

WSY444的博客 5万+

基于单片机的自动喷淋系统设计【毕业设计】

随着人民生活质量提高与生活节奏的加快,城市居民对于花草绿植的家庭培养与装饰需求增加,随之因浇灌植物的需要,智能浇花系统的市场逐渐扩大。现有自动浇花系统大部分只能通过设置固定浇水时间而难以实现适时、适量浇水,或在植物环境土壤含水量低时进行报警而并不能实际补水。为克服局限性而设计以单片机为控制中心的自动浇花系统。通过湿度传感器检测目标植物环境土壤湿度数据,再经ADCO832将其放大转换为数字量,由单片机读取输出向LCD1602 显示屏显示并通过比对键盘向单片机所设置的湿度范围而利用中断服务程序进行补水需求判断。

qq_48771816的博客 1712

AMEsim柱塞泵的建模学习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、为什么要对柱塞泵进行仿真?二、Amesim中柱塞泵的模型1.amesim中自己的定排量五柱塞的斜盘柱塞泵2.压力、流量仿真总结 前言 最近在学习Amesim进行柱塞泵的仿真学习,顺便在这里记录我的学习过程,这是我的初衷 提示:以下是本篇文章正文内容,下面案例可供参考 一、为什么要对柱塞泵进行仿真? 柱塞泵是功能和动力学比较复杂的流体机械。而在实际实验中,往往没有条件或者需要对柱塞泵做一些优化,所以需要我们利用仿真...

innocent_cft的博客 8187

容斥原理 博弈论(多种Nim游戏解法)

容斥原理【容斥原理的简介 能被整除的数(典型例题)扩展:用DPS实现】 博弈论【博弈论中的相关性质 博弈论的相关结论 先手必败必胜的证明 Nim游戏 台阶-Nim游戏 Mex函数与SG函数(集合-Nim游戏 拆分-Nim游戏)】

咸鱼势力登场 1242

YOLOv11改进 - C3k2融合 | C3k2融合CBSA 收缩 - 广播自注意力:轻量级设计实现高效特征压缩,优化处理效率 | NeurIPS 2025

本文介绍收缩 - 广播自注意力(CBSA)((Contract-and-Broadcast Self-Attention))机制,并将其集成到YOLOv11中。传统注意力机制存在黑盒难理解、计算复杂度高的问题,CBSA通过算法展开推导出本质上可解释且高效的注意力机制。它先从输入数据中选出少量代表性tokens,接着对代表进行收缩计算,再将结果广播给所有原始数据。该机制计算量线性增长,具有明确数学解释,还能统一多种注意力机制。我们将CBSA代码集成到YOLOv11的C3k2模块中。实验证明,改进后的YOLOv

魔改工程师的博客 853

C++:博弈(威佐夫博奕)(学不会来找我)

有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。

m0_61360607的博客 483

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Swift】LeedCode Nim 游戏

【Swift】LeedCode Nim 游戏 由于各大平台的算法题的解法很少有Swift的版本,小编这边将会出个专辑为手撕LeetCode算法题。新手撕算法。请包涵!!! 你和你的朋友,两个人一起玩 Nim 游戏: 桌子上有一堆石头。 你们轮流进行自己的回合, 你作为先手 。 每一回合,轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。如果可以赢,返回 true;否则,返回 false 。

张璟冰的博客 2503

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++:博弈(尼姆博奕)(学不会来找我)

有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析一下要如何才能够取胜。

m0_61360607的博客 686

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

尼姆(Nim)游戏【博弈论】C++

开始时,有一堆物体,物体的数量可以是任意的。尼姆游戏的关键在于找到赢的策略。根据“尼姆和”的原理,当堆中物体的数量异或(XOR)运算结果为0时,第一个玩家将处于劣势。许多复杂的博弈问题都可以通过尼姆游戏的分析来解决,因为尼姆游戏具有简单而清晰的规则,并且可以应用于各种不同的情境。游戏的目标是通过移动游戏中的物体或减少物体的数量来使对手无法继续移动,从而获得胜利。然而,在实际的尼姆游戏中,玩家可以通过巧妙地选择物体的数量来制造劣势,从而获得胜利。这需要对游戏的状态进行分析,并找到一个优势的策略。

xcc134679的博客 1820

组合数学——Nim取子游戏

Nim取子游戏是由两个人面对若干堆硬币(或石子)进行的游戏。设有k>=1堆硬币,各堆分别含有N1,N2,……NK枚硬币。游戏的目的就是选择最后剩下的硬币。游戏法则如下:1.两个游戏人交替进行游戏(游戏人I和游戏人II);2.当轮到每个游戏人取子时,选择这些堆中的一堆,并从所选的堆中取走至少一枚硬币(游戏人可以取走他所选堆中的全部硬币);3.当所有的堆都变成空堆时,最后取子的游戏人即为胜

王来安的专栏 8711

Nim问题和阶梯Nim(staircase nim)

经典的取石子游戏,与异或操作进行结合

月巴虫丰博客 1864

NIM游戏讲解(超级全面,SG函数代码模板,三种题型)

Nim 游戏 n堆物品,每堆有m 个,两个玩家轮流取走任意一堆的任意个物品,但不能不取。 取走最后一个物品的人获胜。 我们先来看第一道题目 题目一: 给定n堆石子,两个玩家轮流操作,每次可以从任意一堆石子中拿走任意数量的石子,可以拿完但不能不拿。无法操作者视为失败。问先手是否存在必胜策略。 输入格式: 第一行包含整数n。第二行包含n个数字,其中第i个数字表示第i堆石子的数量。 输出格式: 如果先手方必胜,则输出“Yes”。 Nim游戏模型,有个结论,设每堆石子个数分别是。 NI

小虾米的博客 1354

【C++】【算法基础】Nim游戏

NimNimNim游戏 给定 nnn 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。 问如果两人都采用最优策略,先手是否必胜。 输入格式 第一行包含整数 nnn。 第二行包含 nnn 个数字,其中第 iii 个数字表示第 iii 堆石子的数量。 输出格式 如果先手方必胜,则输出 Yes。 否则,输出 No。 数据范围 1≤n≤1051≤n≤10^51≤n≤105,1≤每堆石子数≤1091≤每堆石子数≤10^91≤每堆石子数≤1

Dusxin的博客 2387

博弈问题

今盒子里有 n 个小球,A、B 两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断.我们约定:a).每个人从盒子中取出的球的数目必须是:1,3,7 或者 8 个.b).轮到某一方取球时不能弃权!c).A 先取球,然后双方交替取球,直到取完.d).被迫拿到最后一个球的一方为负方(输方).C语言版:#inclu...

weixin_34306593的博客 352

Nim问题

将每堆的数表示为二进制形式,然后将所有数异或起来,如果先手时,异或的结果为非0,则必赢(调整某个二进制的某几位,使其变为0),为0时必输。 #include <cstdio> int a[] = {5, 10, 15}; // nim游戏 bool solve(){ int res = 0; int n = sizeof(a) / sizeof(a[0]); for (int i = 0; i < n; ++i) { res ^= a[i]; .

多思考🤔~ 653

博弈论之Nim问题

通常的Nim游戏的定义         有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。 L.Bouton 提出了如下定理,从而彻底地解决了 Nim 问题: 异或和值为零则后手胜,否则先手胜。 理解:首先可以将每个石子的个数分成多个2的指数倍的

nininicrystal的专栏 802

(转载)Nim游戏博弈(收集完全版)

Nim游戏的概述: 还记得这个游戏吗? 给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠,但不能在两列中取。最后拿光珍珠的人输。 后来,在一份资料上看到,这种游戏称为“拈(Nim)”。据说,它源自中国,经由被贩卖到美洲的奴工们外传。辛苦的工人们,在工作闲暇之余,用石头玩游戏以排遣寂寞。后来流传到高级人士,则用便士(Pennies),在酒吧柜台上玩。 最有名的玩法,是把十二枚便

lethic的专栏 3711

如何赢得数学游戏(博弈问题)

数学游戏(博弈问题)是最优化问题中的一类,同时它也是一类很有趣的逻辑推理问题。其中运用最广的思维是:倒推思维。例1.桌子上有24根火柴,甲、乙两人轮流取,每人每次取1—3根。谁取到最后一根谁就获胜。甲该怎样取才能保证获胜?解析:甲要获胜,就要拿到第24根火柴;要想拿到第24根火柴,必须先拿到第20根;要想拿到第20根,必须先拿到第16根,同理可推出,甲必须先拿到第12、8、4根,甲才获胜。所以,解决

爱橙子的OK绷的专栏 3745
上一篇: 「动态规划::线性DP」股票问题合集 / LeetCode 121|122|123|188 (C++)
下一篇: 「动态规划::背包DP」多重背包 / 二进制优化|单调队列优化 / AcWing 4|5|6(C++)
Daking-
博客等级 码龄3年 912粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值