ZOJ Problem Set - 1842 Prime Distance
Chieh
posted @ 2018年3月13日 17:10
in ZOJ
, 387 阅读
飞机票:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=842
用素数快速筛选法,因为r-l<=1000000,所以只要筛选[l,r]之间的素数,对于1要特殊处理,我是直接当l=1时,l++,因为我的算法是筛[l,r),所以,对于给定的r,要r++;然后就是直接暴力求解了。
#include<iostream> #include<stdio.h> typedef long long ll; using namespace std; bool is_prime_small[1000009]; bool is_prime[1000009]; ///对区间[a,b)内的整数进行筛选。 is_prime[i-a]=true <=> i是素数 void segment_sieve(ll a,ll b) { for(int i=0;(ll)i*i<b;i++) is_prime_small[i]=true; for(int i=0;i<b-a;i++) is_prime[i]=true; for(int i=2;(ll)i*i<b;i++) if(is_prime_small[i]) { for(int j=2*i;(ll)j*j<b;j+=i) is_prime_small[j]=false; for(ll j=max(2LL,(a+i-1)/i)*i;j<b;j+=i) is_prime[j-a]=false; } } int main() { ll a,b,c; while(scanf("%lld%lld",&a,&b)!=EOF){ b++; if(a==1)a++; segment_sieve( a, b); c=b-a; ll a1,a2,b1,b2,c1,c2; c1=1000000; c2=-1; ll bef=0; for(int i=0;i<c;i++) { if(is_prime[i]) { if(bef==0){ bef=a+i; continue; } else{ ll p=i+a-bef; if(p<c1){ c1=p; a1=bef; b1=i+a; } if(p>c2){ c2=p; a2=bef; b2=i+a; } bef=i+a; } } } if(c2==-1){ printf("There are no adjacent primes.\n"); } else{ printf("%lld,%lld are closest, %lld,%lld are most distant.\n",a1,b1,a2,b2); } } return 0; }