#include<iostream>
using namespace std;
long long prime[46500], prime1[1000010], pcount, p1count, in[46500], in1[1000010];
void getsprime()
{
for (int i =2; i < 46500; ++i)
{
in[i] = 1;
}
for (int i = 2; i*i <= 46500; ++i)
{
if (in[i])
{
for (int j = 2 * i; j < 46500; j += i)
{
in[j] = 0;
}
}
}
pcount = 0;
for (int i = 2; i < 46500; ++i)
{
if (in[i])
prime[pcount++] = i;
}
}
void getlprime(__int64 L, __int64 U)
{
if (U < 46500)
{
p1count = 0;
for (__int64 i = L; i <= U; ++i)
{
if (in[i])
prime1[p1count++] = i;
}
}
else
{
for (int i = 0; i <= U - L; ++i)
in1[i] = 1;
for (__int64 i = 0; i <= pcount && prime[i] * prime[i] <= U; ++i)
{
__int64 k = L / prime[i];
if (k*prime[i] < L)
{
k++;
}
if (k <= 1)
k++;
while (k*prime[i] <= U)
{
in1[k*prime[i] - L] = 0;
k++;
}
}
p1count = 0;
for (__int64 i = 0; i <= U-L; ++i)<span style="white-space:pre"> </span>//注意这里i不是从0到最后,而是有限制的
{
if (in1[i])
prime1[p1count++] = i+L;
}
}
}
int main()
{
//void getsprime();
getsprime();//构建1到46500(即sqrt(2147483647))之间的素数表
long long L, U;
while (cin >> L >> U)
{
getlprime(L, U);//构造给定区间的素数表
if (p1count<2)//假如有筛出的素数中,素数的个数小于2个,那么就一定不可能存在相邻的两个素数
{
cout << "There are no adjacent primes." << endl;
continue;
}
else
{
long long min = 2147483647, max = -1;
long long distant, xmin, ymin, xmax, ymax;
for (long i = 0; i<p1count - 1; ++i)
{
distant = prime1[i + 1] - prime1[i];
if (distant<min)//找最小距离的位置
{
min = distant;
xmin = i;
ymin = i + 1;
}
if (distant>max)//找最大距离的位置
{
max = distant;
xmax = i;
ymax = i + 1;
}
}
cout << prime1[xmin] << ',' << prime1[ymin] << " are closest, " << prime1[xmax] << ',' << prime1[ymax] << " are most distant." << endl;
}
}
return 0;
}