题解:SG打表
从1到n列出一堆石子所有可能的情况,在搜索小于这个i的所有斐波那契数,标记当前 i 减去斐波那契数产生子局面
的SG值,之后得到当前n的SG值
#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long int
using namespace std;
int m,n,p;
int f[1005],sg[1005],ha[1005];
void F()
{
f[1] = 1;
f[2] = 1;
for(int i = 3 ; f[i-1]<=1000 ; i++)
{
f[i] = f[i-1]+f[i-2];
}
}
void SG(int n)
{
memset(sg,0,sizeof(sg));
for(int i = 1; i <=n ; i++)
{
memset(ha,0,sizeof(ha));
for(int j = 1 ; f[j]<=i ; j++)
ha[sg[i-f[j]]] =1;
for(int j = 0 ; j <= n ; j++)
{
if(ha[j]==0)
{
sg[i] = j;
break;
}
}
}
}
int main()
{
F();
SG(1000);
while(cin>>n>>m>>p&&n+m+p!=0)
{
int sum = 0;
sum^=sg[n]^sg[m]^sg[p];
if(sum != 0) cout<<"Fibo"<<endl;
else cout<<"Nacci"<<endl;
}
return 0;
}