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;
}
这里用到二次筛选,并且区间长度为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;
}
相关文章推荐
- POJ 2689 Prime Distance(筛选两次素数)
- POJ 2689 Prime Distance
- POJ 2689 Prime Distance(大区间素数筛法,两次筛法)
- POJ 2689 Prime Distance(大区间素数筛选)
- POJ 2689 Prime Distance(筛法)
- poj 2689——Prime Distance
- POJ - 2689 Prime Distance(2次用筛法)
- POJ-2689 Prime Distance,区间素数筛法
- POJ 2689 Prime Distance(筛法求素数)
- POJ 2689 Prime Distance 求素数距离(两次筛选)
- POJ 2689 Prime Distance 素数筛选法应用
- POJ-2689-Prime Distance
- [POJ 2689] Prime Distance
- poj 2689 Prime Distance (素数二次筛法)
- POJ 2689/ ZOJ 1842: Prime Distance[两次筛法/筛选法平移]
- poj2689 prime distance
- poj 2689 Prime Distance(大区间素数)
- POJ 2689 Prime Distance(素数筛选)
- POJ-2689 Prime Distance(区间素数筛--经典题)
- POJ 2689 Prime Distance 二次筛选