文章不错,大家可以看看。
搞了半天原来SG函数这么简单,类比为Nim真是碉炸啦!
不太会写,将原理拿过来直接敲了。
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp( int a,int b ){
return a<b;
}
int mex( int rec[],int cnt )
{
sort( rec,rec+cnt,cmp );
if( rec[0] )
return 0;
for( int i=1;i<cnt;i++ )
{
if( rec[i]==rec[i-1] )
continue;
if( rec[i]!=rec[i-1]+1 )
return rec[i-1]+1;
}
return rec[cnt-1]+1;
}
int main()
{
int n,m,p;
int sg[1111],f[1111];
f[1]=f[2]=1;
for( int i=3;;i++ )
{
f[i]=f[i-1]+f[i-2];
if( f[i]>1111 )
break;
}
memset( sg,0,sizeof(sg) );
int rec[1111];int cnt=0;
for( int i=1;i<=1000;i++ )
{
cnt=0;
for( int k=1;i-f[k]>=0;k++ )
{
rec[cnt++]=sg[i-f[k]];
}
sg[i]=mex( rec,cnt );
}
while( scanf("%d %d %d",&n,&m,&p)!=EOF )
{
if( n+m+p==0 )
break;
if( sg[n]^sg[m]^sg[p] )
printf( "Fibo\n" );
else
printf( "Nacci\n" );
}
return 0;
}