取石子游戏HDU-2516(斐波那契博弈)

发布于 2020-10-30  0 次阅读


题目大意:

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

思路:

找规律会发现每一个必败点都是斐波那契数列中的值

AC Code:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<math.h>
using namespace std;
#define endl '\n'
#define INF 0x3f3f3f3f
// #define int long long
#define debug(a) cout<<#a<<"="<<a<<endl;
typedef long long ll;
const double PI=acos(-1.0);
const double e=exp(1.0);
const int M=1e9+7;
const int N=2e5+7;
inline int mymax(int x,int y){return x>y?x:y;}
inline int mymin(int x,int y){return x<y?x:y;}
int f[59];

void init(){
    f[0]=2, f[1]=3;
    for(int i=2; i<=45; i++) f[i]=f[i-1]+f[i-2];
}

void solve(){
    int n;
    init();
    while(~scanf("%d", &n) && n){
        int flag=1;
        for(int i=0; i<=45; i++) if(f[i]==n) {flag=0; break;}
        if(flag)    cout<<"First win"<<endl;
        else        cout<<"Second win"<<endl;
    }
	return ;
}

signed main(){
    solve();
    return 0;
}

平平无奇的在校大学生