/**/
/*
* 0.09s
* 很郁闷了二天,得个教训:数据类型千万要统一
*/
#include < iostream >
#include < cmath >
using namespace std ;
#define MAXN 48000
bool primec[MAXN] ;
bool num[ 1000010 ] ;
long long prime[MAXN], len ;
long long low, up ;
// 速度相对比较慢,但是不用开标记数组
/**/ /*void inti()
{
prime[0] = 2, prime[1] = 3, len = 2;
for (long long n=5,i; n<=MAXN; n+=2) {
for (i=1; prime[i]*prime[i]<=n && n%prime[i]; i++);
if (prime[i]*prime[i] > n) prime[len++] = n;
}
}*/
// 速度应该是最快的了,缺点就是要标记
void inti()
... {
long long i, j ;
len = 1 ;
prime[0] = 2 ;
memset(primec,0,sizeof(primec)) ;
for ( i = 3 ; i <= sqrt(double(MAXN)) ; i += 2 ) ...{
if ( !primec[i] ) ...{
for ( j = i+i ; j < MAXN ; j += i ) ...{
primec[j] = true ;
}
}
}
for ( i = 3 ; i < 47000 ; i +=2 ) ...{
if ( !primec[i] ) prime[len++] = i ;
}
//printf ( "%d ", prime[len-1] ) ;
}
// 使用已经出来的素数继续筛选
// 注意中间过程数据很有可能超出范围
void work()
... {
if ( low == 1 ) low ++ ;
memset(num,0,sizeof(bool)*(up-low+1)) ;
long long i, j, x ;
// int temp = sqrt(double(up)) ;
//try{
for ( i = 0 ; prime[i]*prime[i]<=up ; i ++ ) ...{
j = low/prime[i]+(low%prime[i]>0) ;
if ( j == 1 ) j ++ ;
for ( j*=prime[i] ; j <= up ; j += prime[i] ) ...{
num[j-low] = true ;
}
}
/**//*}
catch (...) {
printf ( "%d ", prime[i] ) ;
printf ( "%d %d ", len, i) ;
}*/
long long k ;
long long a = -1, b = -1, MIN = 10000000 ;
long long c = -1, d = -1, MAX = -1 ;
for ( k = 0 ; k < up-low+1 ; k++ ) ...{
if ( !num[k] ) ...{
x = k ;
break ;
}
}
for ( k++ ; k < up-low+1 ; k++ ) ...{
if ( !num[k] ) ...{
if ( k-x < MIN ) ...{
MIN = k-x ;
a = x ; b = k ;
}
if ( k-x > MAX ) ...{
MAX = k-x ;
c = x ; d = k ;
}
x = k ;
}
}
if ( b == -1 ) ...{
printf ( "There are no adjacent primes. " ) ;
}
else ...{
cout << a+low << "," << b+low << " are closest, "
<< c+low << "," << d+low << " are most distant. " ;
//printf ( "%lld,%lld are closest, %lld,%lld are most distant. ", a+low, b+low, c+low, d+low ) ;
}
}
int main ( void )
... {
inti() ;
while ( 2 == scanf ( "%lld%lld", &low, &up ) ) ...{
work() ;
}
return 0 ;
}
* 0.09s
* 很郁闷了二天,得个教训:数据类型千万要统一
*/
#include < iostream >
#include < cmath >
using namespace std ;
#define MAXN 48000
bool primec[MAXN] ;
bool num[ 1000010 ] ;
long long prime[MAXN], len ;
long long low, up ;
// 速度相对比较慢,但是不用开标记数组
/**/ /*void inti()
{
prime[0] = 2, prime[1] = 3, len = 2;
for (long long n=5,i; n<=MAXN; n+=2) {
for (i=1; prime[i]*prime[i]<=n && n%prime[i]; i++);
if (prime[i]*prime[i] > n) prime[len++] = n;
}
}*/
// 速度应该是最快的了,缺点就是要标记
void inti()
... {
long long i, j ;
len = 1 ;
prime[0] = 2 ;
memset(primec,0,sizeof(primec)) ;
for ( i = 3 ; i <= sqrt(double(MAXN)) ; i += 2 ) ...{
if ( !primec[i] ) ...{
for ( j = i+i ; j < MAXN ; j += i ) ...{
primec[j] = true ;
}
}
}
for ( i = 3 ; i < 47000 ; i +=2 ) ...{
if ( !primec[i] ) prime[len++] = i ;
}
//printf ( "%d ", prime[len-1] ) ;
}
// 使用已经出来的素数继续筛选
// 注意中间过程数据很有可能超出范围
void work()
... {
if ( low == 1 ) low ++ ;
memset(num,0,sizeof(bool)*(up-low+1)) ;
long long i, j, x ;
// int temp = sqrt(double(up)) ;
//try{
for ( i = 0 ; prime[i]*prime[i]<=up ; i ++ ) ...{
j = low/prime[i]+(low%prime[i]>0) ;
if ( j == 1 ) j ++ ;
for ( j*=prime[i] ; j <= up ; j += prime[i] ) ...{
num[j-low] = true ;
}
}
/**//*}
catch (...) {
printf ( "%d ", prime[i] ) ;
printf ( "%d %d ", len, i) ;
}*/
long long k ;
long long a = -1, b = -1, MIN = 10000000 ;
long long c = -1, d = -1, MAX = -1 ;
for ( k = 0 ; k < up-low+1 ; k++ ) ...{
if ( !num[k] ) ...{
x = k ;
break ;
}
}
for ( k++ ; k < up-low+1 ; k++ ) ...{
if ( !num[k] ) ...{
if ( k-x < MIN ) ...{
MIN = k-x ;
a = x ; b = k ;
}
if ( k-x > MAX ) ...{
MAX = k-x ;
c = x ; d = k ;
}
x = k ;
}
}
if ( b == -1 ) ...{
printf ( "There are no adjacent primes. " ) ;
}
else ...{
cout << a+low << "," << b+low << " are closest, "
<< c+low << "," << d+low << " are most distant. " ;
//printf ( "%lld,%lld are closest, %lld,%lld are most distant. ", a+low, b+low, c+low, d+low ) ;
}
}
int main ( void )
... {
inti() ;
while ( 2 == scanf ( "%lld%lld", &low, &up ) ) ...{
work() ;
}
return 0 ;
}