HDU 1848 Fibonacci again and again

这是一道赤裸裸的SG函数的题目;

View Code
 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 }

 

posted @ 2012-04-21 20:15  wutaoKeen  阅读(259)  评论(0编辑  收藏  举报