這一題就是一個斐波那契博弈問題。
斐波那契博弈:
有一堆個數爲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;
}