首页 > 其他分享 >SG函数

SG函数

时间:2023-08-25 21:56:27浏览次数:52  
标签:状态 有向图 函数 rm oplus SG 游戏

\(\rm NOIP\) 模拟赛考了 \(\rm SG\) 函数,于是来贺一发 oi-wiki

Part 1:公平组合游戏 \(\rm ICG\)

若一个游戏满足:

  • 由两名玩家交替行动

  • 在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关

  • 不能行动的玩家判负

则称该游戏为一个公平组合游戏

经典的公平组合游戏有很多,包括取数游戏,\(\rm 31\) 点,以及 \(\rm NIM\) 游戏等。

博弈图和状态

如果将每个状态视为一个节点,再从每个状态向它的后继状态连边,我们就可以得到一个博弈状态图。

定义必胜状态先手必胜的状态必败状态为*先手必败的状态**。

通过推理,我们可以得出下面三条定理:

  • 没有后继状态的状态是必败状态。
  • 一个状态是必胜状态当且仅当存在至少一个必败状态为它的后继状态。
  • 一个状态是必败状态当且仅当它的所有后继状态均为必胜状态。

如果博弈图是一个有向无环图,则通过这三个定理,我们可以在绘出博弈图的情况下用 \(O(n+m)\) 的时间(其中 \(n\) 为状态种数,\(m\) 为边数)得出每个状态是必胜状态还是必败状态。

\(\rm NIM\) 游戏

地上有 \(n\) 堆石子,第 \(i\) 堆石子有 \(a_i\) 个。两名玩家轮流行动,每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。问先手能否必胜

定理

\(\rm NIM\) 游戏先手必胜,当且仅当 \(a_1⊕a_2⊕\dots⊕a_n\ne 0\)

证明:为了证明该定理,只需要证明下面三个定理:

  • 定理 1:没有后继状态的状态是必败状态。
  • 定理 2:对于 \(a_1 \oplus a_2 \oplus \ldots \oplus a_n \neq 0\) 的局面,一定存在某种移动使得 \(a_1 \oplus a_2 \oplus \ldots \oplus a_n = 0\)。
  • 定理 3:对于 \(a_1 \oplus a_2 \oplus \ldots \oplus a_n = 0\) 的局面,一定不存在某种移动使得 \(a_1 \oplus a_2 \oplus \ldots \oplus a_n = 0\)。

对于定理 1,没有后继状态的状态只有一个,即全 \(0\) 局面。此时 \(a_1 \oplus a_2 \oplus \ldots \oplus a_n = 0\)。

对于定理 2,不妨假设 \(a_1 \oplus a_2 \oplus \ldots a_n = k \neq 0\)。如果我们要将 \(a_i\) 改为 \(a_i'\),则 \(a_i'=a_i \oplus k\)。容易证明存在这样的 \(a_i\) 使得 \(a_i'<a_i\)

对于定理 3,如果我们要将 \(a_i\) 改为 \(a_i'\),则根据异或运算律可以得出
\(a_i=a_i'\),因而这不是个合法的移动。

Part 2:有向图游戏与 \(\rm SG\) 函数

在一个有向无环图中,只有一个起点,上面有一个棋子,两个玩家轮流沿着有向边推动棋子,不能走的玩家判负。该游戏被称为有向图游戏

大部分的公平组合游戏都可以转换为有向图游戏。具体方法是,把每个局面看成图中的一个节点,并且从每个局面沿着合法行动能够到达的下一个局面连有向边

\(\rm Mex\) 运算

设 \(S\) 表示一个非负整数集合。定义 \(\operatorname{mex}(S)\) 函数的值为不属于集合 \(S\) 中的最小非负整数,即:

\[\text{mex}(S)=\min\limits_{x\in \mathbb{N},x\not\in S}\{x\} \]

\(\rm SG\) 函数

在有向图游戏中,对于每个节点 \(x\),设从 \(x\) 出发共有 \(k\) 条有向边,分别到达节点 \(y_1,y_2,\dots,y_k\),定义 \(\rm SG(x)\) 为 \(x\) 的后继节点 \(y_1,y_2,\dots,y_k\) 的 \(\rm SG\) 函数值构成的集合再执行 \(\rm mex\) 运算的结果,即:

\[\text{SG}(x)=\text{mex}(\{\text{SG}(y_1),\text{SG}(y_2),\dots,\text{SG}(y_k)\}) \]

特别地,整个有向图游戏 \(G\) 的 \(\rm SG\) 函数值被定义为有向图游戏起点 \(s\) 的 \(\rm SG\) 函数值,即 \(\text{SG}(G)=\text{SG}(s)\)

有向图游戏的和

设 \(G_1,G_2,\dots,G_m\) 是 \(m\) 个有向图游戏。定义组合游戏 \(G\),它的行动规则是任选某个有向图游戏 \(G_i\),并在 \(G_i\) 上行动一步。\(G\) 被称为有向图游戏 \(G_1,G_2,\dots,G_m\) 的和。

有向图游戏的和的 \(\rm SG\) 函数值等于包含它的各个子游戏的 \(\rm SG\) 函数值的异或和,即:

\[\text{SG}(G)=\operatorname{SG}(G_1) \oplus \operatorname{SG}(G_2) \oplus \ldots \oplus \operatorname{SG}(G_m) \]

定理

  • 有向图游戏的某个局面必胜,当且仅当该局面对应节点的 \(\rm SG\) 函数值大于 \(0\)

  • 有向图游戏的某个局面必败,当且仅当该局面对应节点的 \(\rm SG\) 函数值等于 \(0\)

标签:状态,有向图,函数,rm,oplus,SG,游戏
From: https://www.cnblogs.com/xishanmeigao/p/17658025.html

相关文章

  • math---多元函数积分方法整理
    复习到了这里,解题方法有点多,脑子有点乱,遂整理一下一、常规的三重积分解法1、先一后二法:用x,y表示z2、先二后一法:用z表示x,y3、球形积分4、常用技巧对称性、轮换对称、换元法(补行列式),其中球形积分就是用到了换元的思想:二、第一型曲线积分第一型曲线积分主要解决......
  • OceanBase通过基表检索数据库中的函数索引
    其实通过dba_indexes这个视图也能检索出来,但是如果通过index_type来过滤性能会极差,实际效率会差很多,可能十几秒中才会出来结果,下面是通过基表视图跳过index_type来检索函数索引。 ......
  • 教你写出高质量函数,简单又实用
    在编写函数时,程序员通常需要遵循以下步骤进行:1、确定最佳的设计逻辑是编写函数时应该考虑的重要因素。这些因素包括设计合理的数据结构、算法和逻辑封装,并且还要考虑到用户的安全因素。挑战在于确保所设计的方案既满足客户需求,又能得到客户的认可,并且要在项目的时间范围内完成。2......
  • Go-函数
    1函数的概念在golang语言中为完成某一功能的程序指令(语句、代码)的集合称为函数;在golang中,函数分为自定义函数、系统函数2函数的基本语法func函数名(形参列表)(返回值类型列表){ 函数体 return返回值列表}//形参列表---表示函数的输入//函数体---为了实现某一功能......
  • iOS开发Swift-函数
    1.函数的定义和调用funcgreet(person:String)->String{//函数名传入值传入值类型返回值类型letgreeting="Hello"+personreturngreeting}print(greet(person:"Anna"))//调用2.函数的参数与返回值 (1)无参函数funcsayHello()->......
  • 1 输出函数:print()
    1输出字符print('HelloWorld!')2输出表达式print(1+1)3输出到文件fp=open('D:\Text.txt','a+');#以读写的方式打开text.txt,文件不存在则新建;存在就在内容后追加print('HelloWorld!',file=fp)fp.close......
  • public async void Start(){ await 函数 } 相当于是同步方法吗?
    在C#中,使用`async`和`await`关键字可以创建异步方法。异步方法不会阻塞当前线程,允许程序在等待耗时操作的同时继续执行其他任务。在你的代码中,`publicasyncvoidStart()`是一个异步方法的声明。然而,与同步方法不同,`await`关键字会将控制权返回给调用方,允许其他操作继续......
  • DQL-聚合函数
       ......
  • 深度学习(十三)——损失函数与反向传播
    一、损失函数:LossFunction官网文档:torch.nn—PyTorch2.0documentation1.LossFunction的作用每次训练神经网络的时候都会有一个目标,也会有一个输出。目标和输出之间的误差,就是用\(Loss\)\(Function\)来衡量的。所以,误差\(Loss\)是越小越好的。此外,我们可以根据误......
  • C++拷贝构造、赋值函数
    拷贝构造拷贝构造就是一种特殊版本的构造函数,格式:类名(const类名&that){    //执行给每个成员变量进行赋值  }什么时候会调用拷贝构造:当使用旧对象(已new的)给新对象(新new的)初始化时,会自动调用拷贝构造    Testt1;//调用无参构造Testt2=t1......