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 }

 

你可能感兴趣的:(fibonacci)