CPP
22
prime divide
Guest on 30th June 2022 02:45:20 AM
#include<stdio.h>
#define MAX 2703664
int prime[ MAX ] = { 0 } , divide[ MAX ] , a[ MAX ] , f[ MAX ] ;
int main()
{
int i , j , k , n , num = 1 , tmp = (int)sqrt( MAX );
printf("%d %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[ 0 ] = f[ 1 ] = 0 ;
for( a[2] = f[ 2 ] = 1 , i = 3 ; i<MAX ; i++ )
{
if( !prime[ i ] )
a[ i ] = 1 ;
else
a[ i ] = a[ i/divide[ i ] ] + a[ divide[ i ] ] ;
f[ i ] = f[ i-1 ] + a[ i ] ;
}
while( scanf( "%d" , &n ) && n >= 0 )
{
printf( "Case %d:" , num++ ) ;
for( i = 0 , j = MAX-1 , k = ( i+j )/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 ;
}