规则: 有n个石子,先手可以取[1,n)个石子,而后的人至多能取上一个取石子数的两倍,即[1,2*x]。取完胜
结论: 若n为斐波那契数,则先手必败,否则必胜
证明:
数学归纳法:
记f[i]为斐波那契数列
若n = f[0] = 2,显然先手必败
设n <= f[k]时,先手必败
当n = f[k+1]时
f[k+1] = f[k] + f[k-1]
对于f[k-1]这一堆石子,由于f[k-1] < f[k],所以这一堆石子一定由后手取完
现在对于f[k]这一堆,我们只要保证先手无法一口气取完,就可保证这一堆也一定由后手取完,即后手胜利
证明在f[k-1]这一堆石子取完后f[k]无法被一口气取完:
对于f[k-1]这一堆石子,后手至多取
2
3
\frac{2}{3}
32f[k-1],我们只要证明
2
3
f
[
k
−
1
]
\frac{2}{3}f[k-1]
32f[k−1] <
1
2
f
[
k
]
\frac{1}{2}f[k]
21f[k]即可
即4f[k-1] < 3f[k] = 3(f[k-1]+f[k-2]) => f[k-1] < 3f[k-2],显然成立
/*
有n个石子
先手可以取[1,n)个石子,而后的人至多能取上一个取石子数的两倍,取完胜
若n为斐波那契数,则先手必败,否则必胜
*/
#include <cstdio>
#include <set>
using namespace std;
int main()
{
set<int> s;
s.insert(2);
s.insert(3);
int temp1 = 2;
int temp2 = 3;
while ( temp1 + temp2 > 0 )
{
int t = temp1 + temp2;
s.insert(t);
temp1 = temp2;
temp2 = t;
}
int n;
while( scanf("%d",&n) && n != 0 )
{
if( s.find(n) != s.end() ) printf("Second win\n");
else printf("First win\n");
}
return 0;
}