送分啦-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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章