问题
有一堆个数为 n n n 的石子,先手第一次可以取任意个石子,但不能取完,之后每次取的石子个数最多只能是上一次的两倍,不能不取,取走最后一个石子的人胜,问先手必胜还是后手必胜
结论
当 n n n 是斐波那契数时,先手必败,否则先手必胜
证明
Zeckendorf(齐肯多夫)定理
内容:任意正整数都可以表示为若干个不连续的斐波那契数之和
证明:数学归纳法
假设对于
<
m
<m
<m 的所有正整数都满足定理,考虑
m
m
m 是否满足
- 若 m m m 是斐波那契数,定理成立
- 若
m
m
m 不是斐波那契数,设
f
i
b
k
<
m
<
f
i
b
k
+
1
fib_k<m<fib_{k+1}
fibk<m<fibk+1
那么令 m ′ = m − f i b k < f i b k + 1 − f i b k < f i b k − 1 m'=m-fib_k<fib_{k+1}-fib_k<fib_{k-1} m′=m−fibk<fibk+1−fibk<fibk−1
由数学归纳法可得 m ′ m' m′ 可分成若干个不连续的斐波那契数之和
因为 m ′ < f i b k − 1 m'<fib_{k-1} m′<fibk−1,所以构成 m ′ m' m′ 的最大斐波那契数 f i b t < f i b k − 1 fib_t<fib_{k-1} fibt<fibk−1,一定不与 f i b k fib_k fibk 连续,定理成立
证明 f i b − n i m fib -nim fib−nim 的结论同样用数学归纳法证明
若对于 1 1 1 到 n − 1 n-1 n−1 都满足 f i b − n i m fib-nim fib−nim 的结论,证明 n n n 也满足
证明当 n n n 不是斐波那契数
根据齐肯多夫定理,
n
=
f
i
b
k
+
.
.
.
+
f
i
b
l
+
f
i
b
t
(
k
>
.
.
.
>
l
>
t
)
n=fib_k+...+fib_l+fib_t(k>...>l>t)
n=fibk+...+fibl+fibt(k>...>l>t),且
k
,
.
.
.
,
l
,
t
k,...,l,t
k,...,l,t 不连续
先手先取
f
i
b
t
fib_t
fibt,那么后手一定取不完
f
i
b
l
fib_l
fibl,那么问题就变成了一个后手先取的
n
n
n 是斐波那契数 的子问题,有数学归纳法可知,后手第一次取任意石子都是必败的,那么第一次取范围更小的石子一定也是必败的
所以后手必败,先手必胜
证明当 n n n 是斐波那契数时,先手必败
若
n
=
f
i
b
k
+
1
=
f
i
b
k
+
f
i
b
k
−
1
n=fib_{k+1}=fib_k+fib_{k-1}
n=fibk+1=fibk+fibk−1,先手第一次取
z
z
z 个石子
当
z
>
=
f
i
b
k
−
1
z>=fib_{k-1}
z>=fibk−1 时,因为
2
∗
f
i
b
k
−
1
>
=
f
i
b
k
2*fib_{k-1}>=fib_k
2∗fibk−1>=fibk,所以后手一定可以取到
f
i
b
k
fib_k
fibk,先手必败
当
z
<
f
i
b
k
−
1
z<fib_{k-1}
z<fibk−1 时,
f
i
b
k
<
n
−
z
<
f
i
b
k
+
1
fib_{k}<n-z<fib_{k+1}
fibk<n−z<fibk+1,所以
n
−
z
n-z
n−z 不是斐波那契数
若
n
−
z
=
f
i
b
k
+
.
.
.
+
f
i
b
t
n-z=fib_k+...+fib_t
n−z=fibk+...+fibt,根据之前的推理,后手下一步一定取
f
i
b
t
fib_t
fibt,当
f
i
b
t
<
=
2
z
fib_t<=2z
fibt<=2z 时,得证,一下证明
f
i
b
t
>
2
z
fib_t>2z
fibt>2z 是不可能出现的
反证法:假设
f
i
b
t
>
2
z
fib_t>2z
fibt>2z,所以
z
<
f
i
b
t
−
1
z<fib_{t-1}
z<fibt−1
因为
n
n
n 是斐波那契数,所以
n
=
z
+
(
n
−
z
)
<
f
i
b
k
+
.
.
.
+
f
i
b
t
+
f
i
b
t
−
1
n=z+(n-z)<fib_{k}+...+fib_t+fib_{t-1}
n=z+(n−z)<fibk+...+fibt+fibt−1
根据齐肯多夫定理,
n
n
n 分解出来的斐波那契数一定是不连续的
所以就算后面的斐波那契数可以一直往前合并,也一定有
n
<
f
i
b
k
+
f
i
b
k
−
1
=
f
i
b
k
+
1
n<fib_k+fib_{k-1}=fib_{k+1}
n<fibk+fibk−1=fibk+1,矛盾