#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;//若直接筛到int的最大值 TLE
#define MAX 150000
#define max 1000005
bool isprime[MAX];
long long prime[MAX],nprime;
void getprime() //筛素数
{
long long i,j;
memset(isprime,1,sizeof(isprime));
nprime=0;
isprime[1]=0;
for(i=2; i<MAX; i++)
if(isprime[i])
{
prime[++nprime]=i; //prime 从1开始计
for(j=i*i; j<MAX; j+=i)
isprime[j]=0;
}
}
bool iprime[max];
void pdprime(long long l,long long u)//筛给定区间素数
{
memset(iprime,1,sizeof(iprime));
if(l==1)// (l/s)*s
iprime[0]=0;
for(int i=1; prime[i]*prime[i]<=u; i++)// 限定条件
{
long long s=prime[i];
for(long long j=(l/s)*s; j<=u; j+=s)//iprime 从0开始计
{ //(l/s)*s 从所在区间的s的倍数开始
if(j-l<0||j==s) //有可能是第一个含有基本素数s的区间 精度问题约束
continue;
iprime[j-l]=0;// 2. 3。 5 7 11 13 17 19 10-20
}
}
}
int main()
{
getprime();
long long l,u;
while(~scanf("%lld%lld",&l,&u))
{
pdprime(l,u);
long long sum=0,dis,maxd=0,mind=9999999,max1,max2,min1,min2,last;
for(int i=0; i<=u-l; i++)
{
if(iprime[i])
{
sum++;
if(sum>=2)
{
dis=i-last;
if(dis<mind)
mind=dis,min1=last+l,min2=i+l;
if(dis>maxd)
maxd=dis,max1=last+l,max2=i+l;
}
last=i;
}
}
if(sum>=2)
printf("%lld,%lld are closest, %lld,%lld are most distant.\n",min1,min2,max1,max2);
else
printf("There are no adjacent primes.\n");
}
return 0;
}
POJ 2689
最新推荐文章于 2021-09-14 14:59:10 发布