斐波那契博弈 HDU 2516

题目链接:https://vjudge.net/problem/HDU-2516

题目详情:

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

Input

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

Output

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

Sample Input

2
13
10000
0

Sample Output

Second win
Second win
First win

解题思路:用一个数组来存斐波那契数列,这里写前五十项就足够了,只要输入的n是斐波那契数,那么后手必胜,反之,先手必胜

参考代码:

#include<iostream>
#include<cstdio>
#define LL long long//开到long long,不然可能会炸
#define N 1000000
#define inf 1<<20
using namespace std;

int fib[50];

int main(){

	fib[0]=1;fib[1]=2;

	for(int i=2;i<45;i++)

		fib[i]=fib[i-1]+fib[i-2];

	int n;

	while(scanf("%d",&n)!=EOF&&n){

		int i=0;

		for(i=0;i<45;i++)

			if(fib[i]==n)

				break;

		if(i<45)

			puts("Second win");

		else

			puts("First win");

	}

	return 0;

}

猜你喜欢

转载自blog.csdn.net/qq_40624026/article/details/81415393