【题解】HDU-2516 取石子游戏

取石子游戏(HDU-2516)

题面

1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win".

输入

输入有多组.每组第1行是2<=n<2^31. n=0退出.

输出

先取者负输出"Second win". 先取者胜输出"First win". 参看Sample Output.

样例输入

1
2
3
4
2
13
10000
0

样例输出

1
2
3
Second win
Second win
First win

提示

思路

单堆Fibonacci博弈,不用求SG函数。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using namespace std;
int f[50];

void fib(){
f[1] = f[2] = 1;
for(int i=3; i<47; i++){
f[i] = f[i-1] + f[i-2];
}
}

int main()
{
fib();
int n;
while(~scanf("%d", &n) && n)
{
int flag = 1;
for(int i=1; i<47; i++){
if(f[i]==n){
printf("Second win\n");
flag = 0;
break;
}
}
if(flag){
printf("First win\n");
}
}
return 0;
}