Nim问题和阶梯Nim(staircase nim)

article/2025/8/20 12:03:24

Nim问题和阶梯Nim(staircase nim)

Nim问题:
有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。

也可以说有 N 堆石子,第 i 堆有 A[i] 个石子,两个人轮流取,每次至少取 1 个石子,最多把该堆石子都取完(假设两个人都足够聪明)。

现在需要求的是谁先手的那一方能不能赢得比赛。

这个问题如果自己慢慢想的话是很难想出一个结果来的,这里直接给出结论,具体的证明过程不用深究。

res = A[0] ^ A[1] ^ A[2] …… A[n]

把每一堆石子的数量进行异或操作,得到结果 res。

若 res != 0,则先手必胜;

若 res == 0,则先手必败;

考虑必胜的局面,就是当先手面对只有一堆石子的情况,这个时候直接全部取走就可以获胜,

而这种情况 res 一定满足 res != 0。

并且在异或操作中只需要一步就可以把 res != 0 的情况转化成 res == 0 的情况。

因此如果先手面对的局面 res != 0 的话,他就可以一步取走某个数量的石子,

将 res == 0 的局面对给对方。

而在 res == 0 的局面下,不管如何取石子,都会破坏这个局面成为 res != 0 的情况。

先手方下回合继续执行上面的步骤即可,这样最终就可以获得游戏胜利。

阶梯Nim问题:

在这里插入图片描述
怎么使用 Nim 来解决问题呢?

对奇数阶的石头进行 Nim,偶数阶的石头对结果不影响。

如上图:res = 2 ^ 3 ^4 = 5 不为 0,故先手必胜

把石头从奇数阶上移到偶数阶上相同于 Nim 中取一次石子。

为什么是奇数阶?

因为最后石子都要到 0 上,从 1 到 0 就是最后一步,这是从奇数阶到偶数阶,

所以认为从奇数阶上移到偶数阶上相当于取一次石子才能保证状态一致。

若 res != 0,先手将非 0 的局面转为 0 的局面,即把部分石子从奇数阶挪到下层偶数阶。

此时对手只有两种选择:

① 挪动奇数阶上的石头,从而打破了 0 的局面,再一次把非 0

的局面留给先手方,先手方继续调整奇数阶的石子即可。

② 挪动偶数阶上的时候到下层的奇数阶上,先手只要将这些刚挪下来的石子继续下挪,

这样奇数阶上的石子数量保持不变,又把 0 的局面留给对手。

这样一来,就能保证先手必胜了。

【END】感谢观看


http://chatgpt.dhexx.cn/article/swHqUhwj.shtml

相关文章

B. Stairs(构造+规律寻找)Codeforces Round #671 (Div. 2)

原题链接: https://codeforces.com/contest/1419/problems 测试样例 input 4 1 8 6 1000000000000000000 output 1 2 1 30 Note In the first test case, it is possible to build only one staircase, that consists of 1 stair. It’s nice. That’s why the answ…

《中英双解》leetCode Arranging Coins (排列硬币)

Arranging Coins 难度简单182收藏分享切换为中文接收动态反馈 You have n coins and you want to build a staircase with these coins. The staircase consists of k rows where the ith row has exactly i coins. The last row of the staircase may be incomplete. Given th…

house of cat

2022强网杯 house of cat 跟着大佬的文章学习了一个新的利用手法 house of cat,原文链接:House of cat新型glibc中IO利用手法解析 && 第六届强网杯House of cat详解 利用条件: 1.能够任意写一个可控地址。 2.能够泄露堆地址和libc…

我谈阶梯博弈(Staircase Nim)

今天在POJ做了一道博弈题..进而了解到了阶梯博弈...下面阐述一下我对于阶梯博弈的理解.. 首先是对阶梯博弈的阐述...博弈在一列阶梯上进行...每个阶梯上放着自然数个点..两个人进行阶梯博弈...每一步则是将一个集体上的若干个点( >1 )移到前面去..最后没有点可以移动的人输.…

阶梯博弈(Staircase Nim)

阶梯博弈!!!下面阐述一下我对于阶梯博弈的理解.. 首先是对阶梯博弈的阐述...博弈在一列阶梯上进行...每个阶梯上放着自然数个点..两个人进行阶梯博弈...每一步则是将一个集体上的若干个点( >1 )移到前面去..最后没有点可以移动的人输.. 如…

我谈阶梯博弈( Staircase Nim )

今天在POJ做了一道博弈题..进而了解到了阶梯博弈...下面阐述一下我对于阶梯博弈的理解.. 首先是对阶梯博弈的阐述...博弈在一列阶梯上进行...每个阶梯上放着自然数个点..两个人进行阶梯博弈...每一步则是将一个集体上的若干个点( >1 )移到前面去..最后没有点可以移动的人输.…

Scala class和case class的区别

在Scala中存在case class,它其实就是一个普通的class。但是它又和普通的class略有区别,如下:   1、初始化的时候可以不用new,当然你也可以加上,普通类一定需要加new; scala> case class Iteblog(name…

hackerrank初级篇之staircase

题目说明&#xff1a; 示例代码&#xff1a; // staircase.cpp: 定义控制台应用程序的入口点。 // // n4 // # // ## // ### //#### // //#include "stdafx.h" #include <windows.h> #include <iostream> using namespace std;void staircase( int …

Staircases

Staircases Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/16384K (Java/Other) Total Submission(s) : 8 Accepted Submission(s) : 5 Problem Description One curious child has a set of N little bricks (5 ≤ N ≤ 500). From these bricks he buil…

自旋锁是什么?

本文内容如有错误、不足之处&#xff0c;欢迎技术爱好者们一同探讨&#xff0c;在本文下面讨论区留言&#xff0c;感谢。 文章目录 定义特点和互斥锁比较适用场景 结论混合是什么意思&#xff1f; 结尾参考资料 定义 自旋锁 spin lock 下面内容摘自维基百科 在软件工程中&…

【自旋锁】

1. 原理 PV操作原理 记录一个锁定状态(就是一个共享资源&#xff0c;基于原子操作) 2. 适用 1. 解决多cpu之间的竞态 2. 可以解决中断程序和普通程序之间的竞态(自旋锁可以用于中断上下文) 3. 加锁时间不宜过长 4. 获得自旋锁期间&#xff0c;不能进行调度(sleep) 例&#xff1…

量子力学之电子自旋与四个量子数

量子力学之电子自旋与四个量子数 前言一、电子自旋是什么&#xff1f;二、四个量子数1.主量子数 n2.角量子数*l*3.磁量子数ml4.自旋量子数ms 三.例题 前言 在笔者学习大学物理量子力学部分时&#xff0c;对此部分非常疑惑&#xff0c;弄明白之后写下来以供查看&#xff0c;水平…

学习自旋电子学的笔记03:初试自旋波模拟

文章目录 前言一、初遇1.Figure S2 (a)2.图4-23.Figure S1 二、暂别1.FFT分析程序包&#xff1a;MFA简介2.使用练习MFA 三、重逢3.Figure S14.FIG.2 (a)5.FIG.2 (b)6.FIG.5 总结 _ _ 远行&#xff01; 前言 四月&#xff0c;过得四真的快啊&#xff0c;这是从入学到现在的第9个…

深入理解CAS (自旋锁)

文章目录 0. 导言1. 什么是CAS2. 保证原子操作2.1 CAS 实现自旋锁2.2 AtomicBoolean 中的CAS2.3 CAS使用场景 3. 锁的分类3.1 乐观锁3.2 悲观锁 4. CAS存在的问题4.1 ABA问题4.2 循环时间长开销大4.3 只能保证一个共享变量的原子操作 0. 导言 背景&#xff1a; 我们都知道&…

CAS和自旋锁

什么是CAS CAS算法&#xff08;Compare And Swap&#xff09;&#xff0c;即比较并替换&#xff0c;是一种实现并发编程时常用到的算法&#xff0c;Java并发包中的很多类都使用了CAS算法。 CAS算法有3个基本操作数&#xff1a; 内存地址V旧的预期值A要修改的新值B CAS使用自…

Java中的自旋锁,手动实现一个自旋锁

自旋锁 CAS是实现自旋锁的基础,CAS利用CPU指令保证了操作的原子性,已达到锁的效果。自旋是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁, 当线程发现锁被占用时,会不断循环判断锁的状态,直到获取。这样的好处是减少线程上下文切换的消耗,缺点是循环…

学习自旋电子学的笔记04:模拟自旋波在弯曲磁畴壁中传播

文章目录 前言零、笔记03中错误的补充改正1.保持电子的极化方向不变的原因2.Oxs_SpinXferEvolve类的额外补充说明3.时间演化器的时间步长相关补充说明 一、文章概述和要复现的微磁模拟1.文章概述2.要复现的微磁模拟 二、FIG.1三、 FIG.21. FIG.2(a-b)2. FIG.2(c-f) 四、 FIG.3五…

CAS和自旋到底是一个概念吗?

问题: CAS是 compare and swap ,就是一个比较工作内存和主内存的值是否相同&#xff0c;相同的话&#xff0c;就用新值来替换这么一个操作。 但是&#xff0c;为什么好多地方都说这是自旋呢&#xff1f; 我理解比较一次的话&#xff0c;成功就返回true了&#xff0c;失败&am…

CAS及CAS自旋

1. CAS简介 比较并交换(compare and swap, CAS)&#xff0c;是原子操作的一种。在多线程没有锁的状态下&#xff0c;可以保证多个线程对同一个值的更新。 CAS可用于在多线程编程中实现不被打断的数据交换操作&#xff0c;从而避免多线程同时改写某一数据时由于执行顺序不确定…

自旋玻璃(spin glass)、自旋冰(spin ice)和量子自旋液体(quantum spin liquid)(之二)

文章目录 13. 几何阻挫&#xff08;Geometrical frustration&#xff09;13.1 磁序&#xff08;Magnetic ordering&#xff09;13.2 数学定义13.3 水冰&#xff08;water ice&#xff09;13.4 Paulings model 的扩展&#xff1a;广义的阻挫13.5 人工几何阻挫铁磁体13.6 没有晶格…