【难度】
做题难度
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□