您的位置:首页 > 其它

POJ 2689 Prime Distance

2016-08-02 08:27 302 查看
做素数方面的题目,最重要的是筛选,切记不要试除,很容易超时。

这里用到二次筛选,并且区间长度为1e6这个信息点非常重要,可以在判断l~u之间的数的时候,符合的数减去l放进数组里,那样的话数组的大小也可以开,需要使用的时候拿出来加上l即可。

//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/8/2.
// Copyright © 2016年 邵金杰. All rights reserved.
//

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=50000;
const int maxl=1000000;
int primes[maxn],isprime[maxn];
int notprime[maxl],prime[maxl];
int getprime()
{
int pi=0;
memset(isprime,1,sizeof(isprime));
for(int i=2;i<=maxn;i++)
{
if(isprime[i]) primes[pi++]=i;
for(int j=0;j<pi&&i*primes[j]<=maxn;j++)
{
isprime[i*primes[j]]=0;
if(i%primes[j]==0) break;
}
}
return pi;
}
void work(int pi,int l,int r)
{
memset(notprime,0,sizeof(notprime));
for(int i=0;i<pi&&(long long)primes[i]*primes[i]<=r;i++)
{
int s=l/primes[i]+(l%primes[i]>0);
if(s<2) s=2;
for(int j=s;(long long)j*primes[i]<=r;j++)
{
if((long long)j*primes[i]>=l) notprime[j*primes[i]-l]=1;
}
}
}
int main()
{
int pi=getprime();
int l,r;
while(scanf("%d%d",&l,&r)!=EOF)
{
int p=0,x1=0,x2=0,x3=0,x4=0,min,max;
work(pi,l,r);
for(int i=0;i<=r-l;i++) if(notprime[i]==0) prime[p++]=i+l;
max=-maxn,min=maxn;
for(int i=0;i<p-1;i++)
{
if(prime[i]==1) continue;
if(prime[i+1]-prime[i]<min) {min=prime[i+1]-prime[i];x1=prime[i];x2=prime[i+1];}
if(prime[i+1]-prime[i]>max) {max=prime[i+1]-prime[i];x3=prime[i];x4=prime[i+1];}
}
if(max==-maxn&&min==maxn) printf("There are no adjacent primes.\n");
else printf("%d,%d are closest, %d,%d are most distant.\n",x1,x2,x3,x4);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: