HDU 1848 Fibonacci again and again
这是一道赤裸裸的SG函数的题目;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 int f[20]={1,1},sg[1024]; 8 void GetFa( ) 9 { 10 for( int i = 2 ; i < 20 ; i ++ ) 11 { 12 f[i] = f[i -1] + f[i - 2]; 13 } 14 } 15 int Getsg( int num ) 16 { 17 int visit[24] = { 0 }; 18 for( int i = 1 ; i < 20 ; i ++ ) 19 { 20 int t = num - f[i]; 21 if( t < 0 ) break; 22 if( sg[t] == -1 ) 23 sg[t] = Getsg( t ); 24 visit[sg[t]] = 1; 25 } 26 for( int i = 0 ; i < 24 ; i ++ ) 27 if( visit[i] == 0 ) 28 return i; 29 } 30 int main( ) 31 { 32 GetFa(); 33 int n , m , p; 34 while( scanf( "%d %d %d",&n, &m , &p ),n || m || p ) 35 { 36 memset( sg , -1 , sizeof( sg ) ); 37 int t = 0; 38 sg[0] = 0; 39 sg[n] = Getsg( n ); 40 t ^= sg[n]; 41 if( sg[m] == -1 ) 42 sg[m] = Getsg( m ); 43 t ^= sg[m]; 44 if( sg[p] == -1 ) 45 sg[p] = Getsg( p ); 46 t ^= sg[p]; 47 if( t == 0 ) puts( "Nacci" ); 48 else puts( "Fibo" ); 49 } 50 //system( "pause" ); 51 return 0; 52 }