POJ-2689 Prime Distance
题意:给定两个数L、U,求L到U范围内相邻两个素数之差最小和最大的两对素数。
思路:因为1<=L< U<=2,147,483,647,而U-L<=1,000,000,所以要对L到U范围内进行素数筛选,然后找出即可。
题目链接:http://poj.org/problem?id=2689
View Code
1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <algorithm> 7 #include <iostream> 8 using namespace std; 9 const int N=50010; 10 const int inf=1<<30; 11 12 bool isprime[N*20]; 13 long long prime[N],primeII[N*20]; 14 long long l,u,cnt,ct; 15 16 void getprime(){ 17 ct=0; 18 long long i,j; 19 memset(isprime,false,sizeof(isprime)); 20 for(i=2;i<N;i++) 21 if(!isprime[i]){ 22 prime[++ct]=i; 23 for(j=2;i*j<N;j++) 24 isprime[i*j]=true; 25 } 26 } 27 28 void getprimeII(){ 29 long long i,j,b; 30 memset(isprime,false,sizeof(isprime)); 31 for(i=1;i<=ct;i++){ 32 b=l/prime[i]; 33 while(b*prime[i]<l||b<=1) 34 b++; 35 for(j=b*prime[i];j<=u;j+=prime[i]) 36 if(j>=l) isprime[j-l]=true; 37 } 38 if(l==1) isprime[0]=true; 39 } 40 41 void solve(){ 42 getprimeII(); 43 long long Min=inf,Max=-inf; 44 long long minl,minr,maxl,maxr; 45 cnt=0; 46 for(long long i=0;i<=u-l;i++) 47 if(!isprime[i]) primeII[++cnt]=i+l; 48 if(cnt<=1) puts("There are no adjacent primes."); 49 else{ 50 for(long long i=1;i<cnt;i++){ 51 if(primeII[i+1]-primeII[i]<Min){ 52 Min=primeII[i+1]-primeII[i]; 53 minl=primeII[i]; 54 minr=primeII[i+1]; 55 } 56 if(primeII[i+1]-primeII[i]>Max){ 57 Max=primeII[i+1]-primeII[i]; 58 maxl=primeII[i]; 59 maxr=primeII[i+1]; 60 } 61 } 62 printf("%lld,%lld are closest, %lld,%lld are most distant.\n",minl,minr,maxl,maxr); 63 } 64 } 65 66 int main(){ 67 68 // freopen("data.in","r",stdin); 69 // freopen("data.out","w",stdout); 70 71 getprime(); 72 while(scanf("%lld%lld",&l,&u)!=EOF){ 73 solve(); 74 } 75 return 0; 76 }