From 234b2167c17a4a66cdf69c33e10315073e5f0b79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Mon, 25 Dec 2023 14:12:53 +0800 Subject: [PATCH] 'commit' --- TangDou/AcWing_TiGao/T5/GameTheory/1319.md | 49 +++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/TangDou/AcWing_TiGao/T5/GameTheory/1319.md b/TangDou/AcWing_TiGao/T5/GameTheory/1319.md index 17ae03b..a2adede 100644 --- a/TangDou/AcWing_TiGao/T5/GameTheory/1319.md +++ b/TangDou/AcWing_TiGao/T5/GameTheory/1319.md @@ -43,6 +43,7 @@ win ### 二、解题思路 +#### 1、$SG$函数 首先定义 $mex$ 函数,这是施加于一个集合的函数,返回 **最小的不属于这个集合的非负整数** 例:$mex({1,2})=0,mex({0,1})=2,mex({0,1,2,4})=3$ @@ -59,7 +60,53 @@ $SG(4)=mex({SG(5),SG(3)})=mex({0,1})=2$ $SG(2)=mex({SG(3)})=mex({1})=0$ $SG(1)=mex({SG(2),SG(4)})=mex({0,2})=1$ -#### 本题思路 +#### 2、本题和 $SG$ 函数有什么关系? +下面先说本题做法,再证明该方法正确性。 + +**做法**:求出每个棋子所在的点的 $SG$ 函数值,将所有值异或起来。若异或值不为 $0$,则输出$win$,否则输出$lose$ + +**证明**: +首先,由于这是一张有向无环图,所以游戏最后一定会结束,也就是说每个棋子最后都会移动到一个点上,且该点没有任何能到达的点。 +那么根据定义,结束状态的所有点的 $SG$ 函数值异或起来为 $0$,做法对于结束状态可行。 +所以接下来,只要证明出 + +- ① 任何一种每个棋子所在点的 $SG$ 函数值异或起来非 $0$ 的情况,一定能通过一次移动棋子,到达一个 每个棋子所在点的 $SG$ 函数值异或起来为 $0$ 的情况 + +- ② 任何一种每个棋子所在点的 $SG$ 函数值异或起来为 $0$ 的情况,一定不能通过一次移动棋子,到达一个每个棋子所在点的 $SG$ 函数值异或起来为 $0$ 的情况 + +那么做法就是对的 + + +**证明** $1$: +设每个棋子所在点的 $SG$ 函数值分别为 $a_1,a_2,⋯,a_n$ +设 $x=a_1 XOR a_2 XOR ⋯ XOR a_n$,设 $x$ 的最高位为第 $k$ 位,那么在 $a_1,a_2,⋯,a_n$ 中,一定有一个值的第 $k$ 位为 $1$。 + +设该值为 $a_i$,那么由于 $x$ 的第 $k$位和 $a_i$ 的第 $k$ 位都是 $1$,且第 $k$ 位是 $x$ 的最高位,所以 $a_i XOR x$ 一定小于 $a_i$ + +又因为 $a_i$ 是其中一个棋子所在点的 $SG$ 函数值,那么根据 $SG$ 函数值的定义,该点能到达的所有点中,一定存在一个点的 $SG$ 函数值为 $a_i XOR x$ + +那么我们就可以将该点上的棋子,移到一个 $SG$ 函数值为 $a_i XOR x$ 的点上去 + +移完之后,原来每个棋子所在点的 $SG$ 函数异或值就变为了 $a_1 XOR a_2 XOR ⋯ XOR a_{i−1} XOR (a_i XOR x) XOR a_{i+1} ⋯ XOR a_n$ + +$=(a_1 XOR a_2 XOR ⋯ XOR a_n) XOR x=x XOR x=0$ + +① 证毕 + + +**证明** $2$: +反证法,设将点 $u$ 上的棋子移动到点 $v$ 上后,每个棋子所在点的 $SG$ 函数值仍然为 $0$ +那就说明 $SG(u)=SG(v)$,不符合 $SG$ 函数的定义,不成立 +② 证毕 + +所以做法是正确的。 + +那么如何求出每个点的 $SG$ 函数值呢? +记忆化搜索就好啦~ +每层记忆化搜索中,如果该点的 $SG$ 函数值已经被计算出,那就直接返回该值。否则用一个 $set$ 记录每个点能到的所有点的 $SG$ 函数值集合,然后从 $0$ 开始遍历,找到第一个 $set$ 里面没有的数,将该值记录在该点上并返回。 + + +#### 3、回到本题 - 如果只有一个棋子(棋子位置是$s$): 先手必胜 $\Leftrightarrow $ `sg(s)!=0`