1. 程式人生 > >HDU 2516 取石子游戲 (博弈論)

HDU 2516 取石子游戲 (博弈論)

取石子游戲

Problem Description 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
Source

解題思路:

這題沒法用sg直接求了,資料量太大了,而且sg會受上次的影響,所以不一定。

因此,只能打表找規律,找到規律發現如果滿足斐波那契數列 f[n]=f[n-1]+f[n-2] 的數列,Second Win 否則 ,First Win

解題程式碼:
#include <iostream>
#include <cstdio>
#include <set>
using namespace std;

set <int> mys;

void ini(){
    int f1=1,f2=1,f3=2;
    while(true){
        f3=f1+f2;
        if(f3<=0) break;
        mys.insert(f3);
        f1=f2;
        f2=f3;
    }
}

int main(){
    ini();
    int n;
    while(scanf("%d",&n)!=EOF && n!=0){
        if(mys.find(n)!=mys.end()) printf("Second win\n");
        else printf("First win\n");
    }
    return 0;
}