送分啦-QAQ(斐波那契博弈)

這一題就是一個斐波那契博弈問題。

斐波那契博弈:
有一堆個數爲n(n>=2)的石子,遊戲雙方輪流取石子,規則如下:

1)先手不能在第一次把所有的石子取完,至少取1顆;

2)之後每次可以取的石子數至少爲1,至多爲對手剛取的石子數的2倍。

約定取走最後一個石子的人爲贏家,求必敗態。

結論:當n爲Fibonacci數的時候,必敗。

f[i]:1,2,3,5,8,13,21,34,55,89……

所以給出的n爲斐波那契數,就輸了;否則就贏了。

代碼:

#include<stdio.h>
#include<string.h>

#include<algorithm>
using namespace std;
int a[100];//記錄斐波那契數

int main()
{
    a[0]=1;
    a[1]=2;
    int inq=2;
    while(inq<=42)//因爲n<=1e9,所以是前42個
    {
        a[inq]=a[inq-1]+a[inq-2];
        inq++;
    }
    int n;
    while(~scanf("%d",&n))
    {
        int p=lower_bound(a,a+44,n)-a;
        if(a[p]==n)
            printf("Sha\n");
        else printf("Xian\n");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章