思路:SG函数的应用,可取的值为不连续的固定值,可用GetSG求出SG,然后三堆数异或。
//0MS
240K
#include
#include
const int M = 1005;
int Fibs[M],SG[M],hash[M];
void Fib()
{
Fibs[1] = 1;
Fibs[2] = 2;
for (int i = 3;Fibs[i] < M ; i ++)
Fibs[i] = Fibs[i-2] + Fibs[i-1];
return ;
}
void GetSG()
{
int i,j;
memset (SG,0,sizeof(SG));
for (i = 1;i < M;i ++)
{
memset (hash,0,sizeof(hash));
for (j = 1;Fibs[j] <= i;j ++)
hash[SG[i-Fibs[j]]] = 1;
for (j = 0;j < M;j ++)
if (!hash[j])
{
SG[i] = j;
break;
}
}
return ;
}
int main ()
{
Fib();
GetSG();
int n,m,p;
while (scanf ("%d%d%d",&n,&m,&p))
{
if (n==0&&m==0&&p==0)
break;
if (SG[m]^SG[n]^SG[p])
printf ("Fibo\n");
else printf ("Nacci\n");
}
return 0;
}
//0MS
#include
#include
const int M = 1005;
int Fibs[M],SG[M],hash[M];
void Fib()
{
}
void GetSG()
{
}
int main ()
{
}