POJ 2689 素數篩法
這道題很講究技巧 不是一般的篩法 一定要充分理解篩法才行 一上來硬做肯定超時 題目給定了兩數的差
就是要把這個區間的素數都給篩出來 那麼先篩出能求出U最大時需要的素數情況 然後通過這些素數再篩
給定區間內的素數 具體看程序 寫的很明白了
#include <iostream> #include<cstdio> #include<cstring> using namespace std; #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; 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) 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) { if(j-l<0||j==s) continue; iprime[j-l]=0; } } } 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; }
最後更新:2017-04-04 07:03:27