http://acm.hdu.edu.cn/showproblem.php?pid=1848
利用Sg函数
#include<iostream>
using namespace std;
int s[20],sg[1010];
bool used[1010];
void plan()
{
s[0]=1,s[1]=2;
int i=2;
while(true)
{
s[i]=s[i-1]+s[i-2];
//cout<<s[i]<<" ";
if(s[i]>1000)break;
i++;
}
}
void Sg()
{
int i,j;
for(i=1;i<1001;i++)
{
fill(used,used+1010,false);
for(j=0;j<20&&s[j]<=1000;j++)
{
if(i<s[j])break;
used[sg[i-s[j]]]=true;
}
for(j=0;j<1001;j++)
{
if(used[j]==false)
{
sg[i]=j;
break;
}
}
}
}
int main()
{
int sum,m,n,p,i;
plan();
Sg();
while(cin>>m>>n>>p)
{
sum=0;
if(m==0&&n==0&&p==0)break;
sum=sum^sg[m]^sg[n]^sg[p];
if(sum!=0)cout<<"Fibo";
else cout<<"Nacci";
cout<<endl;
}
return 0;
}