牛客练习赛67:C 题 牛牛爱博弈
做题难度 2 / 10 2/10 2/10
证明难度 3.5 / 10 3.5/10 3.5/10
一共有 n n n 个石子。每个人轮流拿石子,但是每人每次只能拿 q q q个石子。
q ∈ { 1 , 2 , 4 , ⋯ , 2 k } q\in \{1,2,4,\cdots,2^k\} q∈{1,2,4,⋯,2k}
谁拿走最后一颗石子即获胜。
A l a n Alan Alan 先拿, F r a m e Frame Frame 后拿。问谁一定获胜?
样 例 组 数 T ≤ 1 0 3 样例组数T\le 10^3 样例组数T≤103
1 ≤ n ≤ 2 × 1 0 9 1\le n\le 2\times10^9 1≤n≤2×109
T 样例组数
n 石子数
6
1
2
3
17
18
19
Alan
Alan
Frame
Alan
Frame
Alan
简单枚举做法
( 1 ) 手 模 ! \color{green}(1)手模! (1)手模!
( 2 ) 分 析 + 代 码 \color{green}(2)分析+代码 (2)分析+代码
考虑博弈的获胜状态。P态表示对于前一个玩家必胜,N态表示对当前玩家必胜。
首先终止状态( n = 0 n=0 n=0)是P态。
若 对 于 某 个 状 态 的 所 有 后 继 状 态 都 是 P 态 , 则 该 状 态 为 N 态 。 若 对 于 某 个 状 态 的 其 中 一 个 后 继 状 态 是 N 态 , 则 该 状 态 为 P 态 。 若对于某个状态的所有后继状态都是P态,则该状态为N态。\\ 若对于某个状态的其中一个后继状态是N态,则该状态为P态。 若对于某个状态的所有后继状态都是P态,则该状态为N态。若对于某个状态的其中一个后继状态是N态,则该状态为P态。
观众:(说人话!)
【 言 简 意 赅 的 解 释 】 \color{red}【言简意赅的解释】 【言简意赅的解释】
简单说,就是如果你某步操作完后,对手怎么操作他都输,那么你一定获胜。
如果你不管怎么操作后,对手总有一种操作方法他能赢,那么你一定输。
进行 d f s \color{red}dfs dfs模拟,计算即可。
/*
_ __ __ _ _
| | \ \ / / | | (_)
| |__ _ _ \ V /__ _ _ __ | | ___ _
| '_ \| | | | \ // _` | '_ \| | / _ \ |
| |_) | |_| | | | (_| | | | | |___| __/ |
|_.__/ \__, | \_/\__,_|_| |_\_____/\___|_|
__/ |
|___/
*/
int dfs(int);
int dfs2(int);
int dfs2(int x){
int ke = 0;
for(int i=1;!ke && i<=x;i*=2){
ke |= dfs(x - i); /// 若对手有一种赢的,那你就输了
}
return !ke;
}
int dfs(int x){
int ke = 0;
for(int i=1;!ke && i<=x;i*=2){
ke |= dfs2(x - i); /// 若对手有一种赢的,那你就输了
}
return !ke;
}
int main()
{
for(int n = 1;n<=20;++n){
if(dfs(n))show2(n,"B");
else show2(n,"A");
}
return 0;
}
然后观察一下结果,发现:
n 时 为 P 态 ⟺ n % 3 = 0 \color{red}n时为P态\iff n\%3=0 n时为P态⟺n%3=0
这么一交,果然就过了。接下来我们来分析一下为什么这样是正确的。
首先,我们需要用到 S G 函 数 \pmb{SG函数} SG函数SG函数SG函数,定义如下:
对 于 任 意 状 态 x , 它 的 S G 函 数 值 g ( x ) = m e x { g ( y ) ∣ y 是 x 的 后 续 状 态 } \color{green}对于任意状态x,它的SG函数值g(x)=mex\{g(y)\big |y是x的后续状态\} 对于任意状态x,它的SG函数值g(x)=mex{g(y)∣∣y是x的后续状态}
其中, m e x ( S ) mex(S) mex(S)定义如下:
m e x ( S ) 为 集 合 S 中 没 有 出 现 的 最 小 非 负 整 数 。 \color{green}mex(S)为集合S中没有出现的最小非负整数。 mex(S)为集合S中没有出现的最小非负整数。
对于博弈论,比如巴什博奕,有如下定理:
状 态 x 为 P 态 ⟺ g ( x ) = 0 状 态 x 为 N 态 ⟺ g ( x ) ≠ 0 \color{red}状态x为P态\iff g(x)=0\\ \color{red}状态x为N态\iff g(x)\ne 0\\ 状态x为P态⟺g(x)=0状态x为N态⟺g(x)=0
我们来回到这题。
首先易得如下:
n = 0 时 , g ( 0 ) = 0 , 为 终 止 P 态 n = 1 时 , g ( 1 ) = 1 , 为 N 态 n = 2 时 , g ( 2 ) = 2 , 为 N 态 n = 3 时 , g ( 3 ) = 0 , 为 P 态 n=0时,g(0)=0,为终止P态\\ n=1时,g(1)=1,为N态\\ n=2时,g(2)=2,为N态\\ n=3时,g(3)=0,为P态 n=0时,g(0)=0,为终止P态n=1时,g(1)=1,为N态n=2时,g(2)=2,为N态n=3时,g(3)=0,为P态
怎么得到的呢?
n=1,可以摸一颗石子,转移到g(0)。因此 m e x mex mex为1。
n=2,可以摸一颗石子,转移到g(1);可以摸两颗石子转移到g(0)。因此 m e x mex mex为2。
n=3,可以摸一颗石子,转移到g(2);可以摸两颗石子转移到g(1)。因此 m e x mex mex为0。
对于状态 p p p,可以摸一颗石子转移到 g ( p − 1 ) g(p-1) g(p−1),可以摸两颗石子转移到 g ( p − 2 ) g(p-2) g(p−2),
还能转移到 g ( p − 2 k ) g(p-2^k) g(p−2k),其中 k ∈ Z k\in\mathbb{Z} k∈Z,并且 p − 2 k ≥ 0 p-2^k\ge0 p−2k≥0。
经过我们手模可以得到这样:
n n n | g ( n ) g(n) g(n) | N/P态 |
---|---|---|
0 | 0 | P |
1 | 1 | N |
2 | 2 | N |
3 | 0 | P |
4 | 1 | N |
5 | 2 | N |
6 | 0 | P |
7 | 1 | N |
规律:
g ( x ) = x % 3 \color{red}g(x)=x\%3 g(x)=x%3
那么我们需要证明一下为什么是这样的规律。
【数学归纳法】
首先,对于 0 ≤ i ≤ 3 0\le i\le 3 0≤i≤3,易得成立。
对于 i ≥ 4 i\ge4 i≥4,假设 g ( i − 1 ) g(i-1) g(i−1)成立,那么 g ( i − 1 ) 与 g ( i − 2 ) 和 g ( i − 3 ) g(i-1)与g(i-2)和g(i-3) g(i−1)与g(i−2)和g(i−3)都不相同
且如下成立:
( g ( i − 3 ) + 2 ) % 3 = ( g ( i − 2 ) + 1 ) % 3 = g ( i − 1 ) = ( i − 1 ) % 3 \Big(g(i-3)+2\Big)\%3=\Big(g(i-2)+1\Big)\%3=g(i-1)=(i-1)\%3 (g(i−3)+2)%3=(g(i−2)+1)%3=g(i−1)=(i−1)%3
首先,对于状态 i i i ,可以摸一颗石子,也可以摸两颗石子,那么:
g ( i ) = m e x { g ( i − 1 ) , g ( i − 2 ) , o t h e r s } = m e x { ( i − 1 ) % 3 , ( i − 2 ) % 3 , o t h e r s } g(i)=mex\Big\{g(i-1),g(i-2),others\Big \}=mex\Big\{ (i-1)\%3,(i-2)\%3,others\Big\} g(i)=mex{g(i−1),g(i−2),others}=mex{(i−1)%3,(i−2)%3,others}
易得
i % 3 ≠ ( i − 1 ) % 3 , i % 3 ≠ ( i − 2 ) % 3 i\%3\ne (i-1)\%3,\quad i\%3\ne(i-2)\%3 i%3=(i−1)%3,i%3=(i−2)%3
那么需要证明others中不包含 i % 3 i\%3 i%3,即:
( i − 2 p ) % 3 ≠ i % 3 , 其 中 p ∈ Z , i − 2 p ≥ 0 \color{red}(i-2^p)\%3\ne i\%3,\quad 其中p\in\mathbb{Z},i-2^p\ge0 (i−2p)%3=i%3,其中p∈Z,i−2p≥0
我们使用反证法
假设存在某个 i i i与某个 p p p,使得 ( i − 2 p ) % 3 = i % 3 (i-2^p)\%3=i\%3 (i−2p)%3=i%3,那么由于取模群运算的性质可得
( i − 2 p ) % 3 = i % 3 ( ( i % 3 − 2 p % 3 ) % 3 + 3 ) % 3 = i % 3 2 p % 3 = 0 ( 矛 盾 ) \begin{aligned} (i-2^p)\%3&= i\%3\\ ((i\%3-2^p\%3)\%3+3)\%3&=i\%3\\ 2^p\%3&=0(矛盾) \end{aligned} (i−2p)%3((i%3−2p%3)%3+3)%32p%3=i%3=i%3=0(矛盾)
易得, 2 p 2^p 2p的因子只有2,因此取模3的余数不会为0。假设不正确,因此得证。
g ( i ) = m e x { ( i − 1 ) % 3 , ( i − 2 ) % 3 } = i % 3 □ \color{red}g(i)=mex\Big\{ (i-1)\%3,(i-2)\%3\Big\}=i\%3\quad\quad\color{black}\Box g(i)=mex{(i−1)%3,(i−2)%3}=i%3□