当前位置: 首页 > news >正文

Nim博弈阶梯型Nim博弈

 Nim博弈模版

image

n个数,Alice和Bob交替取数,Alice先手,每次必须选择一个数取走至少为1的正整数,没有数可取的人输掉比赛。

结论:所有数字的异或和为0时,为必败态;所有数字的异或和不为0时为必胜态。

那么如何去理解这个呢?首先,我们定义异或和为0为状态0异或和非0为状态1,同时用k来表示状态1下所有数的异或和的最高位1的位置。进一步分析,我们可以发现在1状态时一定会存在奇数个 数的第k个二进制位为1,而我们让其中一个数去异或所有数的异或和之后,这个数本身肯定是会减小的,因此是符合游戏规定的操作,在我们进行这个操作之后,所有数的异或和在原本的基础上多异或了一遍他本身。因此状态1必定可以通过一次操作转化为状态0.

而状态0不管如何减少,都会转化为状态1.最终0的状态也为状态0.

由此,当我们先手拿到的是状态1,我们就可以保证对方拿到的是状态0,我方拿到的永远是状态1,进而保证必胜。相对的,如果拿到了状态0,我们是必败的。

Nim博弈变式

2026ICPC南昌邀请铜牌题

我们再来看这题。本题在Nim博弈的基础上多加了一个操作叫做k的限制,即每次减少的数必须<=k直到最终状态为0.

本质上 状态0必定会在一次操作后变为状态1这个条件不会发生任何改变,而k就限制了状态1是否能变成状态0:。

尝试发现k=1的情况是平凡的,如果当前总和为奇数必胜,偶数必败。当k>=2时如果你拿到了总和为奇数的情况时就可以让k=1.此时回到了必胜态。因此双方的最优策略一定是给对方总和为偶数的状态,此时我们每次只会选偶数去减,直到不得不选1.但是偶数的选择是多种多样的,我们很难在原数组的情况下去操作和计算,此时我们需要再次考虑转化。因为每次都只能选偶数,我们可以把它转化为选择一个数 x满足1<=x<=k/2.同时,所有的数也都可以对2向下取整。这样就转化为一个子问题:

在所有ai/2的数组中选择x使得该数组全部为0.

如果向下整除后a数组的和仍为偶数且k仍不为1时就可以一直转化直到k=1或者a数组的和变为奇数。因为k=1的情况是平凡的,因此我们对a数组的和变为奇数的情况做思考。如果a数组的和变为奇数的话,此时新k就可以取1这个子问题就出现了必胜态(Nim博弈结论)。进一步转化后,疑惑和的最低位1的位置就是最小的t使得子问题出现必胜态。

因此只要比较异或和的最低位1和k的大小即可确定胜负。如果k是要大于异或和最低位1所表示的数的(如:异或和10100就是100(4),如果k>=4,则必胜,否则必败)。总结来看代码相当简单,25行不到,但是相当难想。

查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve(){int n,k;cin>>n>>k;int x=0;for(int i=1;i<=n;i++){int y;cin>>y;x^=y;}if(x!=0 && (x&-x)<=k)cout<<"Alice";else cout<<"Bob";cout<<'\n';
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int _=1;cin>>_;while(_--)solve();
}

台阶型Nim博弈

image

跟Nim博弈不同的是,本题一次操作并不会把一堆里的部分数直接删除,而是放到下一阶梯的数上。我们可先模仿Nim博弈本身的实现思路:发掘最终状态可能的性质,并且该性质可以在一次操作之后必然不存在,并且可以在不存在的状态下经过一次特定操作使其又回到原来的状态。先给出最终结论:

当奇数位上的数异或和不为0时,先手必胜;否则,先手必败。

因为如果奇数位上的数异或和为0时,经过一次随意的操作可以使其必然不为0,而如果异或和不为0时,经过一次特定的操作可以使其必然为0

那么偶数位上的数异或和不为0时(除了第0位)能否构成必胜态呢?答案是不行的,因为0号位是基底。当一方在从偶数位拿一部分石子放在奇数位时,另一方可以将其直接下沿到下一个偶数位,继续保持奇数位的异或和为0,但当一方从奇数位拿一部分石子放在偶数位时,另一方不能将其直接下沿到下一个奇数位进而保证偶数位异或和为0,因为如果把1阶梯的数放在0阶梯,那就不能下放了。

具体地:
1.假设当前偶数层(如第2层)有石子,奇数层(第1层)异或和为0(必败态)。
2.若先手从第2层移动c个石子到第1层,则第1层石子数增加,奇数层异或和变为非0,看似给对手一个“必胜态”。
3.但后手可以立即将这个石子从第1层全部移到第0层(因为第1层是奇数层,可以向下移动)。这样第1层石子数恢复原状,奇数层异或和回到0,且第2层减少了c。
4.因此,后手总能通过“反弹”操作,保持奇数层的异或和不变(即保持必败态),同时逐步消耗偶数层的石子。最终,偶数层的石子会全部被推入地面,而奇数层始终为0,后手获胜。相反,如果奇数层异或和为0,先手从奇数层移动石子到地面(第0层),则奇数层异或和变为非0,但后手无法从地面再向上移动石子,所以这个影响无法被抵消。因此奇数层的异或和才是真正的胜负判据。

后记

Nim博弈所带来的启发:发掘最终状态可能的性质,并且该性质可以在一次操作之后必然不存在,并且可以在不存在的状态下经过一次特定操作使其又回到原来的状态。

其实Nim博弈中的异或和思想是SG定理中的一个特例。可以将其推广到任意的公平组合游戏:计算每个状态的Grundy数,必败态即Grundy=0的状态。如果游戏能分解为独立子游戏,则总Grundy=子游戏Grundy的异或和。如果游戏不能分解,则仍可递归计算整个状态的Grundy数(例如通过DP或记忆化搜索)。

之后如果有时间我会进行更深入的研究

http://www.jsqmd.com/news/873101/

相关文章:

  • 收藏|2026 版程序员必看:5 大高薪赛道 + 大模型学习指南,小白也能逆袭
  • RISC-V高性能单板计算机“昉·星光 2”深度评测与开发实践
  • WebPageTest:企业级分布式网页性能检测架构与优化实践
  • 构建符合ISO 26262的嵌入式软件模型测试完整解决方案
  • 基于SpringBoot+Vue的校友录与捐赠系统毕业设计
  • 2026年全球生成式引擎优化GEO领域综合实力领先3家服务商深度解析 - 产业观察网
  • 如何快速实现浏览器隐身:puppeteer-extra-stealth的完整指南
  • LosslessCut 3.68.0 官方版下载(夸克网盘+百度网盘,SHA256校验)
  • 5G FWA智能终端技术解析:从核心架构到运营商集采实战
  • 3分钟搞定!全平台资源下载神器res-downloader终极使用手册
  • 5G FWA智能终端技术解析:从核心原理到部署实践
  • ARM处理器与RISC架构:从设计哲学到嵌入式编程实践
  • 光伏板缺陷检测数据集|红外可见光双模态|无人机光伏巡检|智慧电网光伏识别数据集
  • 2026年4月AOI厂家推荐,SMT贴片机/X-Ray智能点料机/AOI/激光打标机/回流焊炉,AOI品牌哪家靠谱 - 品牌推荐师
  • KindEditor实战指南:开源富文本编辑器的完整技术解析与部署方案
  • 矿山灾害应急回溯:UWB离线即失联,无感定位全程轨迹留存
  • Insomnia终极指南:构建高效API测试与协作的完整工作流
  • 2026年中国生成式引擎优化GEO领域综合实力领先的三家服务商深度分析 - 产业观察网
  • 终极指南:免费开源AMD锐龙调试工具SMUDebugTool完整使用教程
  • 3大创新特性解析:重新定义音乐聚合体验的智能API解决方案
  • 利用Taotoken的API Key分级管理实现项目间的资源隔离
  • 5步快速上手ScriptHookV:GTA V模组开发完整指南
  • 5G NSA双连接架构详解:从MCG/SCG到PCell/PSCell的实战解析
  • RK3588核心板开发全解析:从8K编解码到NPU AI应用实战
  • 阿里云服务器ECS的租用教程
  • 2026 Java+AI落地实战,后端开发者快速入局智能开发
  • 2026亲测:专业降AI率软件选这款就对了3秒改写无痕迹
  • 写给新手的 cann-spack-package:昇腾Spack包管理到底是啥?
  • 2026 合肥求职攻略 —— 本地正规招聘平台推荐 - drfdxr
  • Microsoft Defender双零日在野利用全解析:从BlueHammer到RedSun的终端沦陷之路