题意
1
1
1堆石子有
n
n
n个,两人轮流取,先取者第
1
1
1次可以取任意多个,但不能全部取完。以后每次取的石子数不能超过上次取子数的
2
2
2倍。取完者胜。问先手是否必胜。
n
<
2
31
n<2^{31}
n<231
分析
结论:先手必败当且仅当 n n n是斐波那契数。
证明:
当
n
=
2
n=2
n=2时显然成立。
若对于 [ 1 , n − 1 ] [1,n-1] [1,n−1]上述结论均成立
当
n
>
2
n>2
n>2且为斐波那契数时,不妨设
n
=
f
k
+
1
=
f
k
+
f
k
−
1
n=f_{k+1}=f_k+f_{k-1}
n=fk+1=fk+fk−1
若先手第一步取的石子数不小于
f
k
−
1
f_{k-1}
fk−1,由于
2
f
k
−
1
>
f
k
2f_{k-1}>f_k
2fk−1>fk,则后手必然可以将剩下的石子取完。
否则的话,可以得知后手必然可以取到前
f
k
−
1
f_{k-1}
fk−1颗石子中的最后一颗,且最后一步取的石子数不会大于
2
3
f
k
−
1
\frac{2}{3}f_{k-1}
32fk−1。又因为
2
3
f
k
−
1
<
1
2
f
k
\frac{2}{3}f_{k-1}<\frac{1}{2}f_k
32fk−1<21fk,所以先手必然不可能一步把剩下的
f
k
f_k
fk颗石子取完,由此可知此时必然先手必败。
当
n
n
n不是斐波那契数时,由齐肯多夫定理可知任何正整数可以表示为若干个不连续的斐波那契数之和,设为
f
a
1
,
…
,
f
a
k
f_{a_1},\dots,f_{a_k}
fa1,…,fak,且
a
1
>
⋯
>
a
k
a_1>\dots>a_k
a1>⋯>ak。
考虑先手第一步取
f
a
k
f_{a_k}
fak颗石子,由
2
f
a
k
<
f
a
k
−
1
2f_{a_k}<f_{a_{k-1}}
2fak<fak−1可知后手无法一次性取完
f
a
k
−
1
f_{a_{k-1}}
fak−1颗石子,所以先手必然可以取掉接下来
f
a
k
−
1
f_{a_{k-1}}
fak−1颗石子中的最后一颗,如此类推,可得到先手必胜。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
typedef long long LL;
LL n;
int main()
{
scanf("%lld",&n);
while (n)
{
LL x=1,y=1;
while (y<n) x=x+y,std::swap(x,y);
if (y==n) puts("Second win");
else puts("First win");
scanf("%lld",&n);
}
return 0;
}