思路:
简单博弈的异或原理加上sg函数就可以,把每一堆石子看成一个单独子游戏。最后的结果就是sg[m],sg[n],sg[p]三者的异或和。
套一下sg函数的模板即可。
代码
#include<stdio.h>
#include<string.h>
int fib[30],s[1010];
bool mex[1010];
int n,m,p;
void getsg(int n)
{
int i,j;
for(i=1;i<=n;i++){
memset(mex,0,sizeof(mex));
for(j=1;fib[j]<=i;j++ )
mex[s[i-fib[j]]]=1;
for(j=0;j<=n;j++)
if(!mex[j])
break;
s[i]=j;
}
}
void init()
{
fib[0]=1,fib[1]=1;
for(int i=2;;++i){
fib[i]=fib[i-1]+fib[i-2];
if(fib[i]>1000)break;
}
memset(s,0,sizeof(s));
getsg(1000);
}
int main()
{
init();
while(~scanf("%d%d%d",&m,&n,&p)&&(m+n+p)){
if(s[m]^s[n]^s[p])
printf("Fibo\n");
else
printf("Nacci\n");
}
return 0;
}