- #include<stdio.h>
- #include<math.h>
- #define MAX 2703664
- int prime[ MAX ] = { 0 } , divide[ MAX ] = { 0 } , *f ;
- int main()
- {
- int i , j , k , n , num = 1 , tmp = (int)sqrt( MAX );
- printf("%d\n", tmp*tmp*tmp);
- for( i = 2 ; i<=tmp ; i++ )
- for( j = i ; !prime[ i ] && i*j < MAX ; j++ )
- for( k = i*j ; !prime[ j ] && k < MAX && k>0 ; k *= i )
- {
- prime[ k ] = 1 ;
- divide[ k ] = i ;
- }
- f = prime ;
- for( f[2] =1 , i = 3 ; i<MAX ; i++ )
- {
- if( !divide[ i ] )
- f[ i ] = 1 ;
- else
- f[ i ] = f[ i/divide[ i ] ] + f[ divide[ i ] ] ;
- }
- f[ 0 ] = f[ 1 ] = 0 ;
- for( f[ 2 ] = 1 , i = 3 ; i<MAX ; i++ )
- f[ i ] = f[ i-1 ] + f[ i ] ;
- while( scanf( "%d" , &n ) && n >= 0 )
- {
- printf( "Case %d:" , num++ ) ;
- for( i = 0 , j = MAX-1 , k = ( MAX-1 )/2 ; ; k = ( i+j )/2 )
- {
- if( j<i )
- {
- puts( " Not possible." ) ;
- break ;
- }
- else if( f[ k ] == n )
- {
- if( f[ k-1 ] == n )
- k-- ;
- printf( " %d!\n" , k ) ;
- break ;
- }
- else if( n>f[ k ] )
- i = k+1 ;
- else if( n<f[ k ] )
- j = k-1 ;
- }
- }
- return 0 ;
- }
Raw Paste