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

N i m Nim Nim游戏

给定 n n n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。

问如果两人都采用最优策略,先手是否必胜。

输入格式

第一行包含整数 n n n

第二行包含 n n n 个数字,其中第 i i i 个数字表示第 i i i 堆石子的数量。

输出格式

如果先手方必胜,则输出 Yes

否则,输出 No

数据范围

1 ≤ n ≤ 1 0 5 1≤n≤10^5 1n105 1 ≤ 每堆石子数 ≤ 1 0 9 1≤每堆石子数≤10^9 1每堆石子数109

输入样例:
2
2 3
输出样例:
Yes

题解

N i m Nim Nim游戏是个挺古老的游戏,但是它的游戏解在 19 19 19世纪才被发现,所以如果没自己想出来也没关系的😏( d o g e . doge. doge.)​​

首先需了解一个位运算 X o r Xor Xor运算(异或运算),其数学符号为 ⊕ \oplus 。其中 a X o r b a\ Xor\ b a Xor b被定义为 a , b a,b a,b相异则为真, a , b a,b a,b相同则为假。它除了交换律,结合律外,还有一些神奇的性质:

  • **自身为自身的逆运算:**即对于任何两个布尔变量或者数有 ( a ⊕ b ) ⊕ b = a (a \oplus b)\oplus b=a (ab)b=a,可以依据这个写出swap(int a, int b)函数:a = a ^ b; b = a ^ b; a = a ^ b,(当然和本题没关系)。

  • **满足消去律:**即由 a ⊕ c = b ⊕ c a \oplus c=b \oplus c ac=bc可以推出 a = b a=b a=b

然后了解一下游戏中两个状态:

  • 必胜状态:先手进行某个操作时,留给了后手了一个必败状态,即先手可以走到某一个必败状态
  • 必败状态:先手无论如何操作,留给后手的都是必胜状态,即先手走不到任何一个必败状态

注:本文中的“走到一个状态”是指当前 A A A走完后,对于 B B B的状态

对于形如 N i m Nim Nim这类博弈问题最重要的是寻找必败态,对于这个必败态,其严格定义如下:

  • 无法进行任何移动的局面是必败态:如果一个玩家在当前状态下没有任何合法的移动可以做,那么这个状态就是必败态。
  • 可以移动到必败态的局面是非必败态:如果一个玩家能够通过一次合法的移动将游戏状态变为对手的必败态,则该玩家处于非必败态。
  • 在必败态做的所有操作的结果都是非必败态:处于必败态的一方,无论做出怎样的合法移动,都会导致自己仍然处于不利的状态。

结论

对于普遍 N i m Nim Nim游戏问题,假设有 n n n堆石头,石子的数目分别是 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an,如果 a 1 ⊕ a 2 ⊕ . . . ⊕ a n ≠ 0 a_1\oplus a_2\oplus...\oplus a_n \neq 0 a1a2...an=0,先手必胜;反之,先手必败。

证明该结论的过程,即为证明其满足以上三个必败态的三条性质即可。

证明( B o u t o n ′ s T h e o r e m Bouton's Theorem BoutonsTheorem):

  • 操作到最后,即无法再进行任何移动时,每堆的石子数都为 0 0 0,即:
    a 1 ⊕ a 2 ⊕ . . . ⊕ a n = 0 a_1\oplus a_2\oplus...\oplus a_n=0 a1a2...an=0

  • 对于第二个可移动到必败局的局面是非必败态,即为:如果对于某个局面 a 1 ⊕ a 2 ⊕ . . . ⊕ a n = x ≠ 0 a_1\oplus a_2\oplus...\oplus a_n=x\neq 0 a1a2...an=x=0,一定存在某个合法的移动,使得 a i a_i ai变为 a i ′ a_i' ai后, a 1 ⊕ a 2 ⊕ . . . ⊕ a i ′ ⊕ . . . ⊕ a n = 0 a_1\oplus a_2\oplus...\oplus a_i'\oplus...\oplus a_n=0 a1a2...ai...an=0

**证明:**不妨设 x x x的二进制表示中最高一位 1 1 1在第 k k k位,则存在 a i a_i ai的二进制表示在 x x x的最高位上的 1 1 1(否则 x x x的最高位的 1 1 1从何得到)。这时 a i ⊕ x < a i a_i\oplus x<a_i aix<ai,不妨从第 i i i堆石子中拿走 ( a i − a i ⊕ x ) (a_i-a_i\oplus x) (aiaix)个石头,即 a i ′ = a i ⊕ x a_i'=a_i\oplus x ai=aix,此时:
a 1 ⊕ a 2 ⊕ . . . ⊕ a i ′ . . . ⊕ a n = x ⊕ x = 0 a_1\oplus a_2\oplus...\oplus a_i'...\oplus a_n=x\oplus x=0 a1a2...ai...an=xx=0

  • 对于第三个在必败态做的所有操作的结果都是非必败态,即为:对于某个局面 a 1 ⊕ a 2 ⊕ . . . ⊕ a n = 0 a_1\oplus a_2\oplus ...\oplus a_n=0 a1a2...an=0,一定不存在某个合法的移动,使得 a i a_i ai变为 a i ′ a_i' ai后, a 1 ⊕ a 2 ⊕ . . . ⊕ a i ′ ⊕ . . . ⊕ a n = x ≠ 0 a_1\oplus a_2\oplus...\oplus a_i'\oplus...\oplus a_n=x\neq 0 a1a2...ai...an=x=0

**反证法:**因为异或运算满足消去率,若 a i a_i ai变为 a i ′ a_i' ai后,运算得出 x = 0 x=0 x=0
a 1 ⊕ a 2 ⊕ . . . ⊕ a i . . . ⊕ a n = a 1 ⊕ a 2 ⊕ . . . ⊕ a i ′ . . . ⊕ a n a_1\oplus a_2\oplus...\oplus a_i...\oplus a_n=a_1\oplus a_2\oplus...\oplus a_i'...\oplus a_n a1a2...ai...an=a1a2...ai...an
a i = a i ′ a_i=a_i' ai=ai,所以将 a i a_i ai移动为 a i ′ a_i' ai是非法的,证毕。

基于对三个必败态的证明:

  • 如果先手面对的局面是 a 1 ⊕ a 2 ⊕ . . . ⊕ a n = x ≠ 0 a_1\oplus a_2\oplus...\oplus a_n=x\neq 0 a1a2...an=x=0,那么先手总可以拿走一堆若干个石子,将局面变为 a 1 ⊕ a 2 ⊕ . . . ⊕ a n = 0 a_1\oplus a_2\oplus...\oplus a_n=0 a1a2...an=0,如此重复,最后一定是后手面临最终没有石子可拿的状态,先手必胜。
  • 先手必败同理。
#include<iostream>
using namespace std;int main()
{int n;cin >> n;int res = 0;while (n -- ){int x;cin >> x;res ^= x;}if(!res) cout << "No" << endl;else cout << "Yes" << endl;return 0;
}

如果将 N i m Nim Nim游戏的规则改变,如:

n n n堆石子,每次可以从第 1 1 1堆中取 1 , 2 1,2 1,2 3 3 3个石子,可以从第 2 2 2堆中取奇数个石子,可以从第 3 3 3堆及以后石子里取任意颗……

此时只知道异或运算暂时还无法应付该情况,所以还需了解一些其他道具。


SG函数

平等组合游戏 ( I C G ) (ICG) (ICG)一种两人轮流进行的、完全信息的、无运气因素的组合游戏,并且游戏中双方的可选行动和胜负条件完全对称,即对两位玩家没有偏向性。在这种游戏中,游戏的状态和操作规则都是公开的,双方都知道所有可能的走法,且没有隐藏信息或随机性。

  1. 两个人进行博弈

  2. 两人轮流进行决策且做出的决策都对自己有利

  3. 游戏中同一个局势不能多次到达且游戏不能有平局

  4. 当有人无法做出决策时游戏结束,无法做出决策的人输

  5. 游戏可以在有限步数内结束

  6. 任意游戏者在某一局势时能做出决策的集合只与当前局势有关,与游戏者本身无关

必胜态与必败态:定义 P − p o s i t i o n , N − p o s i t i o n P-position,N-position Pposition,Nposition

  • P − p o s i t i o n P−position Pposition:必败态(简称 P P P),即在决策前就处于这种状态的人必败
  • N − p o s i t i o n N−position Nposition:必胜态(简称 N N N),即在决策前就处于这种状态的人必胜

如果更严谨的定义 P P P N N N,则:

  • 无法移动的状态为 P P P,(或为 T e r m i n a l − p o s i t i o n Terminal-position Terminalposition

  • 可以移动到 P P P的状态为 N N N

  • 任意移动都会到 N N N的状态为 P P P

组合游戏中的 D A G DAG DAG​图:如果我们将每一种状态向它能到达的状态连边,那么一个组合游戏的所有状态就能组成一个 D A G DAG DAG(有向无环图):

给出一张DAG,在给定起点处有一枚棋子,两人轮流移动棋子,如果谁不能移动了就判输。

也就是说,任何一个 I C G ICG ICG都可以通过把每个局面看成一个顶点,对每个局面和它的子局面连一条有向边来抽象成这个“有向图游戏”。

S G SG SG函数是人们在研究博弈问题上迈出的一大步,人们不再一味的通过找规律来得到博弈结论,而是将博弈问题的每一个状态进行量化分析并总结出了某些普遍性的规律。

SG函数及SG定理

给出一张DAG,在给定起点处有一枚棋子,两人轮流移动棋子,如果谁不能移动了就判输。

这个游戏可以认为是所有 I C G ICG ICG的抽象模型

下面我们在有向无环图的顶点定义** S p r a g u e − G a r u n d y Sprague-Garundy SpragueGarundy函数**。首先定义** m e x mex mex运算**,表示集合中最小的未出现的自然数,如: m e x { 1 , 2 , 3 } = 0 , m e x { 0 , 2 , 3 } = 1 mex\lbrace 1,2,3 \rbrace=0,mex\lbrace 0,2,3\rbrace=1 mex{1,2,3}=0,mex{0,2,3}=1

对于给定一个的有向无环图中,定义关于图的每个顶点的 S p r a g u e − G a r u n d y Sprague-Garundy SpragueGarundy函数为:
S G ( x ) = m e x { g ( y ) ∣ y 为 x 的后继 } = m e x ( { S G ( y 1 ) , S G ( y 2 ) , . . . , S G ( y k ) } ) SG(x)=mex\lbrace g(y)|y为x的后继\rbrace=mex(\lbrace SG(y_1),SG(y_2),...,SG(y_k)\rbrace) SG(x)=mex{g(y)yx的后继}=mex({SG(y1),SG(y2),...,SG(yk)})
S G SG SG函数描述的是博弈中某个状态量化后的值。其有以下性质:

  • 终止状态 S G SG SG值为 0 0 0,因为它没有出边(即可到达的状态):即所有 T e r m i n a l − p o s i t i o n Terminal-position Terminalposition所对应的顶点,也就是没有出边的顶点,其后续集合为空集,所以 S G SG SG值为 0 0 0
  • S G SG SG值为 0 0 0的状态为必败态,它的后继状态 S G SG SG值都不为 0 0 0,满足必败态定义:对于一个 S G ( x ) = 0 SG(x)=0 SG(x)=0顶点 x x x,其所有的后续 y y y都满足 S G ( y ) ≠ 0 SG(y)\neq 0 SG(y)=0
  • S G SG SG值不为 0 0 0的状态为必胜态,它的后继状态 S G SG SG值有为 0 0 0的状态,满足必胜态定义:对于一个 S G ( x ) ≠ 0 SG(x)\neq 0 SG(x)=0顶点 x x x,必定存在一个后续 y y y满足 S G ( y ) = 0 SG(y)=0 SG(y)=0

不妨再考虑以下顶点的 S G SG SG值的意义:

S G ( x ) = k SG(x)=k SG(x)=k时,表明对于任意一个 0 ⩽ i < k 0\leqslant i<k 0i<k,都存在 x x x的一个后继 y y y满足 S G ( y ) = i SG(y)=i SG(y)=i,也就是说当某个棋子的 S G SG SG值是 k k k时,我们可以转换成任意的 i i i,但绝不能保持 k k k不变。同时,在 N i m Nim Nim游戏中,每次都必须选择拿走石子,而不能保持 k k k不变。这表明,如果将 n n n枚棋子所在的顶点的 S G SG SG值看作 n n n堆相应数量的石子,那么这个 N i m Nim Nim游戏的每个必胜策略都对应于原来的这 n n n枚棋子的必胜策略。

对于 n n n个棋子,设它们对应的顶点的 S G SG SG值为 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an,再设局面 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an时的 N i m Nim Nim游戏的一种必胜策略是将 a i a_i ai变为 k k k,那么原游戏中的一种必胜策略就是把第 i i i枚棋子移动到一个 S G SG SG值为 k k k的顶点。

接下来证明这种多棋子的有向图游戏的局面是 P − p o s i t i o n P-position Pposition当且仅当所有棋子所在的位置的 S G SG SG函数的异或和( N u m Num Num和)为 0 0 0即可。该证明与 N i m Nim Nim游戏中证明必胜策略( B o u t o n ′ s T h e o r e m Bouton's Theorem BoutonsTheorem)差不多相同。

注:如果 n n n枚棋子不是在一个有向图上,而是每个棋子都在一个有向图上,每次可以任选一个棋子进行移动,这样并不会给结论带来任何变化。

定义有向图游戏的和:设 G 1 , G 2 , . . . , G n G_1,G_2,...,G_n G1,G2,...,Gn n n n个有向图游戏,定义游戏 G G G G 1 , G 2 , . . . , G n G_1,G_2,...,G_n G1,G2,...,Gn的和,游戏 G G G的移动规则是:任选择一个子游戏 G i G_i Gi并移动上面的棋子。则 S G ( G ) = S G ( G 1 ) ⊕ S G ( G 2 ) ⊕ . . . ⊕ S G ( G n ) SG(G)=SG(G_1)\oplus SG(G_2)\oplus...\oplus SG(G_n) SG(G)=SG(G1)SG(G2)...SG(Gn),即游戏的和的 S G SG SG值为其所有子游戏的 S G SG SG函数值的异或和。

那么一个局面为先手必败当且仅当该局面的 S G SG SG值为 0 0 0。同样如果游戏的和为 0 0 0,那么先手必败。

证明(SG):

所有终止状态的 S G SG SG值都是 0 0 0,每次如果先手使本来 S G SG SG值异或和为 0 0 0的局面异或和改变为 k k k,那么后手就一定能找到一个单一游戏使它的 S G SG SG值从 S G ( x ) SG(x) SG(x)变成 S G ( x ) ⊕ k SG(x)\oplus k SG(x)k。因为 S G ( x ) ⊕ k < S G ( x ) SG(x)\oplus k<SG(x) SG(x)k<SG(x),而 x x x的后继状态一定有一个状态的 S G SG SG值为比它小的 S G ( x ) ⊕ k SG(x)\oplus k SG(x)k

之前有提到,任何一个 I C G ICG ICG都可以抽象成一个有向图游戏。所以 S G SG SG函数和游戏的和的概念就可以用于不止有向图游戏中了。我们给每个 I C G ICG ICG的每个局面定义 S G SG SG值,以及 n n n I C G ICG ICG的和。当面对由 n n n个游戏组成的一个游戏是,只需对于每个游戏找出求它的每个局面的 S G SG SG值的方法即可。

而如何求解 S G SG SG函数,根据定义可知:依次枚举每种状态并枚举每种状态能到达的状态,找到每个状态后继状态 S G SG SG值中没有出现的最小自然数就是它的 S G SG SG值。

综上:知道 S G SG SG函数和游戏的和后,我们就可以把复杂的游戏分解成若干个子游戏,对于每个子游戏找出它的 S G SG SG函数,然后全部异或和得到原游戏的 S G SG SG函数​,​就可以​优雅​地​解决​原游戏了😎。​


回到游戏规则改变后的 N i m Nim Nim问题:

n n n堆石子,每次可以从第 1 1 1堆中取 1 , 2 1,2 1,2 3 3 3个石子,可以从第 2 2 2堆中取奇数个石子,可以从第 3 3 3堆及以后石子里取任意颗……

题解:

  • 我们可以将其看作三个子游戏

  • 第一个游戏:只有一个堆,每次取出 1 , 2 1,2 1,2 3 3 3个石子:

    • 状态 0 的 S G 值为 0 ( 无石子 ) 状态 1 的 S G 值为 1 ( 取 1 石子 ) 状态 2 的 S G 值为 2 ( 取 2 石子 ) 状态 3 的 S G 值为 3 ( 取 3 石子 ) 状态 4 的 S G 值回到 0 ,因为取 1 , 2 , 3 可以回到之前已有状态 状态0的SG值为0(无石子)\\ 状态1的SG值为1(取1石子)\\ 状态2的SG值为2(取2石子)\\ 状态3的SG值为3(取3石子)\\ 状态4的SG值回到0,因为取1,2,3可以回到之前已有状态 状态0SG值为0(无石子)状态1SG值为1(1石子)状态2SG值为2(2石子)状态3SG值为3(3石子)状态4SG值回到0,因为取1,2,3可以回到之前已有状态

    • 易得: x x x个石子的 S G SG SG值为 x m o d 4 x\bmod 4 xmod4

  • 第二个游戏:只有一个堆,每次取出奇数个石子:

    • 状态 0 的 S G 值为 0 状态 1 的 S G 值为 1 ( 取 1 个石子 ) 状态 2 的 S G 值为 0 ( 只能取奇数个,剩 1 后变成已知 S G 值的状态 ) 状态 3 的 S G 值为 1 ( 取 1 个石子到状态 2 ,或取 3 个到状态 0 ) 状态 0 的 SG 值为 0 \\ 状态 1 的 SG 值为 1(取 1 个石子)\\ 状态 2 的 SG 值为 0(只能取奇数个,剩 1 后变成已知 SG 值的状态)\\ 状态 3 的 SG 值为 1(取 1 个石子到状态 2,或取 3 个到状态 0) 状态0SG值为0状态1SG值为1(1个石子)状态2SG值为0(只能取奇数个,剩1后变成已知SG值的状态)状态3SG值为1(1个石子到状态2,或取3个到状态0)

    • x x x个石子的 S G SG SG值为 x m o d 2 x\bmod 2 xmod2

  • 第三个游戏即为普通 N i m Nim Nim游戏了

根据 S G SG SG定理可得:
S G t o t a l = S G ( G 1 ) ⊕ S G ( G 2 ) ⊕ [ S G ( G 3 ) ⊕ . . . ⊕ S G ( G n ) ] SG_{total}=SG(G_1)\oplus SG(G_2)\oplus\left[SG(G_3)\oplus...\oplus SG(G_n)\right] SGtotal=SG(G1)SG(G2)[SG(G3)...SG(Gn)]
S G t o t a l = 0 SG_{total}=0 SGtotal=0,当前局面为必败局,反之为必胜局。


a n t i − S G anti-SG antiSG S J SJ SJ定理

两个顶尖聪明的人在玩游戏,有 n n n堆石子,第 i i i堆有 a i a_i ai个,每人每次能从一堆石子中取任意多个石子但不能不取,取到最后一个的人输,请问先手与后手谁必胜?

相较于普遍 N i m Nim Nim游戏来说,变为了无法操作的人获胜,而进行最后一个操作的人失败。

经过分析,我们发现先手必胜有两种情况:

  • 每堆石子数异或和不为 0 0 0且至少有一堆石子数大于 1 1 1

  • 每堆石子数异或和为 0 0 0且每堆石子只有 1 1 1

证明:

  • 由于异或和不为 0 0 0,根据 N i m Nim Nim游戏的性质,先手一定能通过操作使得异或和变为 0 0 0,所以异或和不为 0 0 0表示局面不是必败态,因此先手有至少一种操作可以确保自己不是最后一个取石子的人。

    • 如果所有堆的石子数都变为 1 1 1,则后手必败(因为没有石子可取)。
  • 如果仍有堆的石子数大于 1 1 1,则先手可以继续保持异或和为 0 0 0的状态,将局面交还给对手。

    由于每次取石子总数递减,游戏最终会走到只剩最后一颗石子的局面。此时,后手被迫取走最后一颗石子,因而输掉游戏。因此,在这种情况下,先手可以通过控制局面变化来保证自己不会是最后一个取石子的人,从而获得胜利

    **具体操作:**我们先除去偶数堆石子数为 1 1 1的石子堆(因为这些一定是轮番取完且不改变先后手关系),先手只要第一次取石子使剩下石子堆异或和为 0 0 0,之后每次只要后手改变异或值就将异或值再取为 0 0 0,到最后一定会剩下两堆同样多数目且数目都大于 1 1 1的石子,假设每一堆剩下 1 + x 1+x 1+x个石子( x > 0 x>0 x>0),这时后手先取:

    • 如果后手将一堆全取走,那么先手将另一堆取 x x x个即可,这时只剩下 1 1 1个;

    • 如果后手使一堆剩下 1 1 1个,那么先手将另一堆全取走即可,这时只剩下 1 1 1个;

    • 如果后手使一堆剩下大于 1 1 1个,那么先手在另一堆取同样多个,局势又变成了剩下两堆 1 + x 1+x 1+x个石子的情况。

  • 当所有堆的石子数的异或和为 0 0 0时,通常表示当前局面为一个“必败态”,即如果对方不犯错误,当前玩家将无法获胜。

    然而,在这种特殊情况下,当每堆只有 1 1 1 个石子,且异或和为 0 0 0,意味着所有的石子数都为 1 1 1 且总数为偶数(异或和为 0 0 0 表示奇偶平衡)。这种局面下,先手可以通过取走一颗石子,将剩下的石子数变为奇数个。此后,先手每次可以模仿后手的操作,以确保自己总是留下偶数个石子给对方,直到最终后手被迫拿走最后一颗石子而输掉比赛。

    因此,当异或和为 0 0 0 且每堆石子数为 1 1 1 时,先手可以通过这样策略性的操作确保后手取走最后一颗石子,从而获胜。

  • 综上:这两种情况之所以是先手必胜的关键原因在于:

    1. 异或和不为 0 且至少一堆石子数大于 1:先手可以通过操作将局面转变为对后手不利的状态,避免自己成为最后一个取石子的人。
    2. 异或和为 0 且每堆石子数为 1:先手可以控制局面,通过对称策略迫使后手成为最后一个取石子的人。

类似于 S G SG SG定理,同样也有 S J SJ SJ定理:

对于 a n t i − S G anti-SG antiSG游戏,先手必胜当且仅当:

  1. 游戏的和不为 0 0 0且至少有一个单一游戏的 S G SG SG函数大于 1 1 1

  2. 游戏的和为 0 0 0且所有单一游戏的 S G SG SG函数不大于 1 1 1

证明和 a n t i − N i m anti−Nim antiNim的证明相同,只不过对于第二种情况一个 S G SG SG函数为 1 1 1的局势可以变成 S G SG SG函数大于 1 1 1的局势,只要将这种情况转为第一种情况就好了。


multi-SG

n n n堆石子,两个人可以从任意一堆石子中拿任意多个石子(不能不拿)或把一堆数量不少于 2 2 2的石子分为两堆不为空的石子。

规定没法拿的人失败,问谁会胜利?

不妨计算过一下前几个状态的 S G SG SG值:
s g ( 1 ) = m e x { s g ( 0 ) } s g ( 2 ) = m e x { s g ( 0 ) , s g ( 1 ) } = 2 s g ( 3 ) = m e x { s g ( 0 ) , s g ( 1 ) , s g ( 2 ) , s g ( 1 , 2 ) } = 4 s g ( 4 ) = m e x { s g ( 0 ) , s g ( 1 ) , s g ( 2 ) , s g ( 1 , 3 ) , s g ( 2 , 2 ) , s g ( 3 ) } = 3 sg(1) = mex\{sg(0)\}\\ sg(2) = mex\{sg(0), sg(1)\} = 2\\ sg(3) = mex\{sg(0), sg(1), sg(2), sg(1,2)\} = 4\\ sg(4) = mex\{sg(0),sg(1), sg(2), sg(1,3), sg(2,2), sg(3)\} = 3 \\ sg(1)=mex{sg(0)}sg(2)=mex{sg(0),sg(1)}=2sg(3)=mex{sg(0),sg(1),sg(2),sg(1,2)}=4sg(4)=mex{sg(0),sg(1),sg(2),sg(1,3),sg(2,2),sg(3)}=3
综上可得:
S G ( x ) = { x − 1 ( x m o d 4 = 0 ) x ( x m o d 4 = 1 ∨ 2 ) x + 1 ( x m o d 4 = 3 ) SG(x) = \begin{cases} x - 1 & (x \mod 4 = 0) \\ x & (x \mod 4 = 1 \vee 2) \\ x + 1 & (x \mod 4 = 3) \end{cases} SG(x)= x1xx+1(xmod4=0)(xmod4=12)(xmod4=3)


every-SG

e v e r y − S G every−SG everySG游戏规定对于任意未结束的单一游戏,游戏者必须对它进行决策,游戏结束时间决定于最后一个结束的单一游戏,胜负则取决于最后一个结束的单一游戏的输赢。

对于每一步决策,因为一直 S G SG SG值为 0 0 0时必败, S G SG SG值不为 0 0 0时必胜,所以我们一定希望 S G SG SG 0 0 0的局势尽快结束, S G SG SG不为 0 0 0的局势尽量慢点结束。

所以需要知道 S G SG SG值为 0 0 0的局势最少多少步结束, S G SG SG值不为 0 0 0的局势最多多少步结束。

我们用 s t e p step step函数来记录这个值:
s t e p ( u ) = { 0 , u为终止状态 max ⁡ { s t e p ( v ) } , s g ( u ) ≠ 0 ∧ v 为 u 的后继 ∧ s g ( v ) = 0 min ⁡ { s t e p ( v ) } , s g ( u ) = 0 ∧ v 为 u 的后继 step(u) = \begin{cases} 0, & \text{u为终止状态} \\ \max\{step(v)\}, & sg(u) \neq 0 \land v为u的后继 \land sg(v) = 0 \\ \min\{step(v)\}, & sg(u) = 0 \land v为u的后继 \end{cases} step(u)= 0,max{step(v)},min{step(v)},u为终止状态sg(u)=0vu的后继sg(v)=0sg(u)=0vu的后继
对于every-SG游戏先手必胜当且仅当单一游戏step最大的一个为奇数。

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

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

相关文章

统信UOS开发环境支持Golang

UOS为Golang开发者提供了各种编辑器和工具链的支持,助力开发者实现高质量应用的开发。 文章目录 一、环境部署Golang开发环境安装二、代码示例Golang开发案例三、常见问题1. 包导入错误2. 系统资源限制一、环境部署 Golang开发环境安装 golang开发环境安装步骤如下: 1)安装…

【c++丨STL】list的使用

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 list简介 一、list的默认成员函数 构造函数(constructor) 析构函数 赋值重载 二、list的迭代器接口 迭代器的功能分类 三、list的容量…

如何解决JAVA程序通过obloader并发导数导致系统夯住的问题 | OceanBase 运维实践

案例背景 某保险机构客户的数据中台&#xff0c;自系统上线后不久&#xff0c;会定期的用 obload 工具从上游业务系统导入数据至OceanBase数据库。但&#xff0c;不久便遇到了应用服务器的 Memory 与 CPU 资源占用持续攀升&#xff0c;最终导致系统夯住而不可用的异常。 memo…

人工智能:塑造未来的工作与生活

目录 人工智能技术的应用前景与影响 人工智能的历史与现状 人工智能的应用领域 人工智能的前景与挑战 个人视角&#xff1a;人工智能的应用前景与未来 人工智能在生活中的潜力 面对人工智能带来的挑战 我的观点与建议 结语 人工智能技术的应用前景与影响 随着人工智能…

MATLAB绘制克莱因瓶

MATLAB绘制克莱因瓶 clc;close all;clear all;warning off;% clear all rand(seed, 100); randn(seed, 100); format long g;% Parameters u_range linspace(0, 2*pi, 100); v_range linspace(0, pi, 50); [U, V] meshgrid(u_range, v_range);% Parametric equations for t…

go-zero(二) api语法和goctl应用

go-zero api语法和goctl应用 在实际开发中&#xff0c;我们更倾向于使用 goctl 来快速生成代码。 goctl 可以根据 api快速生成代码模板&#xff0c;包括模型、逻辑、处理器、路由等&#xff0c;大幅提高开发效率。 一、构建api demo 现在我们通过 goctl 创建一个最小化的 HT…

鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)

元服务是什么&#xff1f;和App的关系&#xff1f; 元服务是是一种HarmonyOS轻量应用形态&#xff0c;用户无需安装即可使用&#xff0c;具备随处可及、服务直达、自由流转的特征。 元服务是可以独立部署和运行的程序实体&#xff0c;独立于应用&#xff0c;不依赖应用可独立…

k8s上部署redis高可用集群

介绍&#xff1a; Redis Cluster通过分片&#xff08;sharding&#xff09;来实现数据的分布式存储&#xff0c;每个master节点都负责一部分数据槽&#xff08;slot&#xff09;。 当一个master节点出现故障时&#xff0c;Redis Cluster能够自动将故障节点的数据槽转移到其他健…

智慧环保平台_大数据平台_综合管理平台_信息化云平台

系统原理   智慧环保是新一代信息技术变革的产物&#xff0c;是信息资源日益成为重要生产要素和信息化向更高阶段发展的表现&#xff0c;是经济社会发展的新引擎。   现今&#xff0c;环保信息化建设进入高速发展阶段。在此轮由物联网掀起的信息浪潮下&#xff0c;环境信息…

《通往人工智能深度学习专家之路:全面解析学习路线图》

《通往人工智能深度学习专家之路&#xff1a;全面解析学习路线图》 一、人工智能深度学习简介1.1 人工智能与深度学习的关系1.2 深度学习的应用领域1.3 深度学习的重要性 二、深度学习路线图总览2.1 学习路线图的结构2.2 各阶段学习目标与重点 三、深度学习基础阶段3.1 数学基础…

Git 分⽀规范 Git Flow 模型

前言 GitFlow 是一种流行的 Git 分支管理策略&#xff0c;由 Vincent Driessen 在 2010 年提出。它提供了一种结构化的方法来管理项目的开发、发布和维护&#xff0c;特别适合大型和复杂的项目。GitFlow 定义了一套明确的分支模型和工作流程&#xff0c;使得团队成员可以更有效…

任务管理功能拆解——如何高效管理项目任务?

在项目管理中&#xff0c;任务管理功能不仅仅是一个操作工具&#xff0c;它是确保项目按时、高效完成的核心所在。无论是小团队还是跨部门合作&#xff0c;任务管理能够帮助项目经理和团队成员清晰地看到每一项任务的执行情况和进度&#xff0c;从而合理调配资源、优化工作流程…

nodejs入门(1):nodejs的前后端分离

一、引言 我关注nodejs还是从前几年做了的一个电力大数据展示系统开始的&#xff0c;当然&#xff0c;我肯定是很多年的计算机基础的&#xff0c;万变不离其宗。 现在web网站都流行所谓的前后端结构&#xff0c;不知不觉我也开始受到这个影响&#xff0c;以前都是前端直接操作…

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的&#xff0c;还可以存链表、数组等等复杂数据结构 而且数据是在…

深入解析大带宽服务器:性能优势与选择指南

一、大带宽服务器是什么&#xff1f; 大带宽服务器指的是具备高网络带宽能力的服务器&#xff0c;通常提供1Gbps、10Gbps甚至更高的网络连接能力。与普通带宽服务器相比&#xff0c;大带宽服务器能够在更短时间内传输大量数据&#xff0c;因此常用于高流量、高并发需求的场景&…

关于Qt C++中connect的几种写法

目录 1. 传统的槽函数写法 2. 使用函数指针的connect写法&#xff08;5.0&#xff09; 3. Lambda表达式作为槽函数&#xff08;C11&#xff09; 4.使用QOverload选择重载信号的写法 这connect函数就像是编程世界里的“茴”字&#xff0c;千变万化&#xff0c;各有千秋。咱们…

常见网络厂商设备默认用户名/密码大全

常见网络厂商的默认用户名/密码 01 思科 (Cisco) 设备类型&#xff1a;路由器、交换机、防火墙、无线控制器 默认用户名&#xff1a;cisco 默认密码&#xff1a;cisco 设备类型&#xff1a;网管型交换机 默认用户名&#xff1a;admin 默认密码&#xff1a;admin 02 华…

elasticsearch是如何实现master选举的?

大家好&#xff0c;我是锋哥。今天分享关于【elasticsearch是如何实现master选举的&#xff1f;】面试题。希望对大家有帮助&#xff1b; elasticsearch是如何实现master选举的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&…

讯飞、阿里云、腾讯云:Android 语音合成服务对比选择

在 移动端 接入语音合成方面&#xff0c;讯飞和腾讯云等都是优秀的选择&#xff0c;但各有其特点和优势。咱们的需求是需要支持普通话/英语/法语三种语言&#xff0c;以下是对各个平台的详细比较&#xff1a; 一、讯飞语音合成介绍 与语音听写相反&#xff0c;语音合成是将一段…

说说软件工程中的“协程”

在软件工程中&#xff0c;协程&#xff08;coroutine&#xff09;是一种程序运行的方式&#xff0c;可以理解成“协作的线程”或“协作的函数”。以下是对协程的详细解释&#xff1a; 一、协程的基本概念 定义&#xff1a;协程是一组序列化的子过程&#xff0c;用户能像指挥家…