【牛客练习赛67:贪心博弈(附证明)】C :牛牛爱博弈

牛客练习赛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 T103
1 ≤ n ≤ 2 × 1 0 9 1\le n\le 2\times10^9 1n2×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态。 PNNP

观众:(说人话!)

【 言 简 意 赅 的 解 释 】 \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 nPn%3=0

这么一交,果然就过了。接下来我们来分析一下为什么这样是正确的。

【证明】

首先,我们需要用到 S G 函 数 \pmb{SG函数} SGSG函数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的后续状态\} xSGg(x)=mex{g(y)yx}
其中, 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\\ xPg(x)=0xNg(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=0g(0)=0Pn=1g(1)=1Nn=2g(2)=2Nn=3g(3)=0P
怎么得到的呢?
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(p1),可以摸两颗石子转移到 g ( p − 2 ) g(p-2) g(p2)
还能转移到 g ( p − 2 k ) g(p-2^k) g(p2k),其中 k ∈ Z k\in\mathbb{Z} kZ,并且 p − 2 k ≥ 0 p-2^k\ge0 p2k0

经过我们手模可以得到这样:

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 0i3,易得成立。
对于 i ≥ 4 i\ge4 i4,假设 g ( i − 1 ) g(i-1) g(i1)成立,那么 g ( i − 1 ) 与 g ( i − 2 ) 和 g ( i − 3 ) g(i-1)与g(i-2)和g(i-3) g(i1)g(i2)g(i3)不相同
且如下成立:
( 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(i3)+2)%3=(g(i2)+1)%3=g(i1)=(i1)%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(i1),g(i2),others}=mex{(i1)%3,(i2)%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=(i1)%3,i%3=(i2)%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 (i2p)%3=i%3,pZ,i2p0

我们使用反证法

假设存在某个 i i i与某个 p p p,使得 ( i − 2 p ) % 3 = i % 3 (i-2^p)\%3=i\%3 (i2p)%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} (i2p)%3((i%32p%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{(i1)%3,(i2)%3}=i%3

你可能感兴趣的:(算法,博弈论)