这一题就是一个斐波那契博弈问题。
斐波那契博弈:
有一堆个数为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;
}