Nim 游戏与 SG 函数

news/2025/11/9 18:53:51/文章来源:https://www.cnblogs.com/Gapple/p/19204690

已完成今日《Nim 游戏与 SG 函数》大学习。

本文比较基础,并未涉及到各种各样的 Nim 游戏,因为笔者比较菜。

1. 公平组合游戏

定义一个游戏为公平组合游戏,当且仅当:

  • 双方都知道当前局面的所有信息。
  • 每一步的操作与玩家无关。
  • 游戏一定在有限步以非平局结束,且同一个状态不可能出现两次。

我们研究公平组合游戏,主要研究先手必胜还是必败。所以定义 \(\mathcal{N}\)为(当前手)必胜态,\(\mathcal{P}\)为(当前手)必败态。容易发现,无法操作的状态一定是 \(\mathcal{P}\) 态。

:在游戏的开局,当前手是先手。这好像是废话。

我们可以把游戏的所有状态画成图,如果 \(X\) 可以一步到 \(Y\),那就连一条 \(X \to Y\) 的有向边。定义这样的图为博弈图。容易发现,对于公平组合游戏,博弈图总是 DAG。

2. Nim 游戏

2.1 Easy Version

现有 \(n\) 个石子,Alice 和 Bob 轮流取 \(i \in [1, 3]\) 个石子(\(i\) 不固定),Alice 先手。无法操作的人失败。何时 Alice 必胜?

什么小奥题。

显然,当 \(4 \nmid n\) 时,Alice 必胜;\(4 \mid n\) 时,Alice 必败。在 \(4 \mid n\) 时,Bob 只需与 Alice 共同拿 \(4\) 个即可。在 \(4 \nmid n\) 时,Alice 先拿 \(n \bmod 4\) 个,这样 Bob 下轮就是 \(\mathcal{P}\) 态。

\(n = 6\) 为例,画出博弈图:

:上图建议搭配 Dark Reader 观看,否则你会看不到边。当然,你可以自己画一个,只有 \(14\) 条边。

红色为 \(\mathcal{P}\) 态,绿色为 \(\mathcal{N}\) 态。观察可以发现:

  • \(\mathcal{N}\) 态的后继中一定存在 \(\mathcal{P}\) 态。此时当前手直接走到 \(\mathcal{P}\) 态,就可以让对方必败。
  • \(\mathcal{P}\) 态的所有后继一定全为 \(\mathcal{N}\) 态。此时当前手无法走到 \(\mathcal{P}\) 态,就无法让对方必败,那么自己一定必败。

2.2 Medium Version

现有 \(n\) 个石子,Alice 和 Bob 轮流取 \(i \in S\) 个石子(\(i\) 不固定,\(S\) 固定),Alice 先手。无法操作的人失败。何时 Alice 必胜?

这时就没有简单的判定方法了。

考虑给每个状态一个编码,使得所有必败状态的编码相同。很明显,直接令 \(\mathcal{N} \to 1, \mathcal{P} \to 0\) 即可。但是这样扩展性不强,有没有扩展性强的做法呢?

考虑 \(\operatorname{mex}\)[1]。发现当 \(0 \in S\) 时,\(\operatorname{mex}(S) \neq 0\);当 \(0 \not \in S\) 时,\(\operatorname{mex}(S) = 0\)。那么直接把当前状态的后继的编码做一个 \(\operatorname{mex}\) 不就是当前状态的编码吗?于是定义:

\[\operatorname{sg}(u) = \operatorname{mex} \set{ \operatorname{sg}(v) : v \in \operatorname{son}(u) } \]

显然,必败态的 \(\operatorname{sg}\)\(0\)。判定时,按拓扑序倒序算出每个点的 \(\operatorname{sg}\),然后判定起点的 \(\operatorname{sg}\) 是否为 \(0\) 即可。

定义游戏的 \(\operatorname{sg}\) 为它的初始局面的 \(\operatorname{sg}\)

2.3 Hard Version

现有 \(n\) 堆石子,第 \(i\) 堆石子有 \(x_i\) 个。Alice 和 Bob 轮流做以下操作:

  • 选一堆石子。
  • 在那一堆中取走任意多个石子。

Alice 先手,无法操作的人失败。何时 Alice 必胜?

发现这其实是 \(n\) 个 Medium Version 拼到一起。因为可以取走任意多个,所以第 \(i\) 堆的 \(\operatorname{sg}\) 一定为 \(x_i\)

事实上,Alice 必胜当且仅当 \(\bigoplus \limits_{i = 1}^n x_i \neq 0\)

证明:若 \(\bigoplus \limits_{i = 1}^n x_i = 0\),此时怎么操作都会让 \(\bigoplus \limits_{i = 1}^n x_i \neq 0\)。假设操作了第 \(i\) 列,发现只有当 \(x_i = \bigoplus \limits_{j \neq i} x_j\)\(\bigoplus \limits_{i = 1}^n x_i = 0\),但是操作后 \(x_i \neq \bigoplus \limits_{j \neq i} x_j\),所以 \(\bigoplus \limits_{i = 1}^n x_i \neq 0\)

\(\bigoplus \limits_{i = 1}^n x_i \neq 0\),此时一定可以操作到 \(\bigoplus \limits_{i = 1}^n x_i = 0\) 的状态。考虑 \(x_i\) 的二进制表示,找到最大的最高位需要变化的 \(x_i\),然后把它减掉一个值,让 \(\bigoplus \limits_{i = 1}^n x_i = 0\)。容易发现,这个值一定存在。\(\square\)

所以我们定义这个游戏的 \(\operatorname{sg}\)\(\bigoplus \limits_{i = 1}^n x_i\)。类似的,设游戏 \(G\) 由互相独立的 \(G_1, G_2, \cdots, G_n\) 组合而成,定义:

\[\operatorname{sg}(G) = \bigoplus \limits_{i = 1}^n \operatorname{sg}(G_i) \]


  1. 定义 \(\operatorname{mex}(S)\) 为最小的不在 \(S\) 内的非负整数。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/960655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题解:Luogu P11114 [ROI 2024] 小推车 (Day 1)

题意 有一排编号为 \(1\sim n\) 的座位。有 \(k\) 种饮料,第 \(i\) 名乘客想要喝第 \(a_i\) 种饮料。小推车需要从 \(0\) 位置出发,最终走到 \(n+1\) 位置,按顺序给每名乘客分饮料。推车上有 \(m\) 个瓶子,每个瓶子…

摸鱼笔记[1]-windows设置双网卡优先级(跃点数)

windows系统通过设置跃点数以设置双网卡优先级, 实现工控局域网网卡和互联网网卡各司其职, 电脑同时访问局域网和互联网.摘要 windows系统通过设置跃点数以设置双网卡优先级, 实现工控局域网网卡和互联网网卡各司其职,…

NXP - 用MDK建立基于arm-none-eabi软件链的工程框架

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

用 OKHttp 和 Retrofit 打造稳如磐石的网络请求:连接池与重试机制的实战指南 - 教程

用 OKHttp 和 Retrofit 打造稳如磐石的网络请求:连接池与重试机制的实战指南 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

数字孪生重构智慧园区:众趣科技何以成为 VR 园区领域标杆 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

电脑监控软件,后台监控,千里眼监控

电脑监控软件,后台监控,适合家庭电脑、员工电脑监控 支持异地远程访问,终身授权最低100R,可月付年付 不限设备数量,支持win7、10、11 1、电脑位置显示 2、桌面远程观看 3、桌面文件下载 4、完整记录按键输入 5、智…

【URP】Unity[后处理]运动模糊MotionBlur

Motion Blur 概念与作用 Motion Blur(运动模糊)是一种模拟真实相机在拍摄快速移动物体或自身移动时产生的模糊效果的后处理技术。它通过模糊图像中运动物体的轨迹,增强动态场景的真实感和【从UnityURP开始探索游戏渲…

go sync.pool 学习笔记

概述 sync.pool 对象池可以用来复用临时对象,减少内存压力,降低 GC 压力。 示例 基本用法 type Worker struct{} func (w *Worker) Name() string { return "worker" } func main() { workerPool :…

初识分布式训练

假设有N块GPU,模型有ψ个参数。 前提知识:每个参数对应一个梯度值,且SGD每个参数对应一个一阶动量,Adam每个参数对应一个一阶、一个二阶动量DP(data parallel) ​ 数据并行(单进程,多线程,只用一个cpu核),每…

电脑监控软件,后台监控,适合家庭电脑、员工电脑监控

电脑监控软件,后台监控,适合家庭电脑、员工电脑监控 支持异地远程访问,终身授权,可月付年付 不限设备数量,支持win7、10、11 1、电脑位置显示 2、桌面远程观看 3、桌面文件下载 4、完整记录按键输入 5、智能屏幕快…

题解:P10856 【MX-X2-T5】「Cfz Round 4」Xor-Forces

题解 首先,我们先考虑简单的情况,没有修改操作。 由题意得,一段区间颜色段个数可以转化为区间长度减去相邻同色个数,即区间 \([l,r]\) 的颜色段数为 \(r-l+1- \sum^r_{i=l+1}[a_i=a_{i-1}]\)。 考虑线段树,那么一…

python: Virtualenv的安装与应用

一,安装Virtualenv 以ubuntu为例: 安装pip # apt install python3-pip 安装virtualenv # apt install python3-virtualenv二,创建环境 $ virtualenv -p /usr/bin/python3.12 myenv 三,进入/退出 环境 进入 $ sourc…

题解:AT_abc147_f [ABC147F] Sum Difference

题意 在一个等差数列中取出若干个元素,求取出的元素与未取出的元素的差值有多少种可能。 思路 首先,我们有一个式子: \[w(i)=\sum_{i \in S}A_i-\sum_{i \notin S}A_i \]不难看出,该式可以变为: \[w(i)=2\times \…

20231326《密码系统设计》第八周预习报告

20231326《密码系统设计》第八周预习报告 目录20231326《密码系统设计》第八周预习报告学习内容《Windows C/C++加密解密实战》第 12 章1. 什么是 SSL 协议 (Secure Sockets Layer)2. SSL/TLS 协议发展历程3. SSL v3/T…

PERL Docker 容器化部署指南

PERL(Practical Extraction and Reporting Language)是一种高级、通用、解释型、动态编程语言,其语法借鉴了C、Shell脚本、AWK和sed等多种语言特性,广泛应用于系统管理、Web开发、网络编程等领域。通过Docker容器化…

解放双手!使用Roslyn生成代码让你的 HTTP 客户端开发变得如此简单

在现代 .NET 开发中,源代码生成器(Source Generators)是一项强大的功能,它允许开发者在编译时自动生成代码,从而减少样板代码的编写,提高开发效率和代码质量。本文主要介绍使用Roslyn实现两个代码生成器:HttpCl…

pandoc用法

要将你的 `文件V5.0_2.docx` 文件转换为 Markdown 格式,使用 **Pandoc** 是一个非常直接的选择。我已经为你准备好了相应的命令,并补充了一些实用技巧。 ### 📝 核心转换命令 在终端或命令行中,导航到你的 `.docx…

JMeter:性能测试利器全解析 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

251109

JT-JY13T1S1Hello, Tourist information center, Mike speaking, how can i help you? Hi, i want to find out about cockery classes. I believe there is some one-day calsses for tourists. Well, they are open…

electron-vite为linux打包成功,但是安装后运行无反应

属于shark插件没有运行 在代码中使用动态导入,如果导入成功就使用shark压缩,如果没有就不压缩。 `// 动态导入 sharp,如果加载失败则优雅降级 let sharp: any = null let sharpAvailable = false async function lo…