UVA10140 Prime Distance【素数/数论】By cellur925

 

题目传送门

我们注意到,L,R是肥肠大的.........我们不可能在1s内筛出2^31内的全部质数。

“上帝为你关上一扇门,同时为你打开一扇窗”

我们又注意到,R-L是肥肠比较小的,珂以从这入手解决问题。

我们知道,任意一个合数x一定包含不超过sqrt(n)的质因子。

所以我们就筛出2~sqrt(R)之间的所有素数,用他们来标记全部范围内的合数。最后没被标记的数就是质数,比较相邻的质数位置取最大。

Code

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<cstring>
 6 
 7 using namespace std;
 8 
 9 int zz,xx,gg,bb,tot,l,r,cnt,minn,maxx;
10 bool v[1000100];
11 int pri[100000],b[1000100];
12 
13 
14 bool prime(int q)
15 {
16     if(q==2||q==3) return 1;
17     if(q==1) return 0;
18     if(q%6!=1&&q%6!=5) return 0;
19     int Vergil=sqrt(q);
20     for(int i=5;i<=Vergil;i+=6)
21      if(q%i==0||q%(i+2)==0) return 0;
22     return 1; 
23 }
24 
25 void pre()
26 {
27     for(int i=1;i<=46340;i++)
28      if(prime(i)) pri[++tot]=i;
29 }
30 
31 int main()
32 {
33     pre();
34     while(cin>>l>>r)
35     {
36         memset(v,1,sizeof(v));cnt=0;
37         if(l==1) v[0]=0;
38         for(int i=1;i<=tot;i++)
39          for(int j=l/pri[i];j<=r/pri[i];j++)
40         if(j>1) v[j*pri[i]-l]=0;//"-l"是在节省空间 
41         for(int i=l;i<=r;i++)
42         {
43             if(v[i-l]) b[++cnt]=i;
44             if(i==r) break;
45         }
46 
47         minn=2147483647,maxx=0;
48         for(int i=1;i<=cnt-1;i++)
49         {
50             int tmp=b[i+1]-b[i];
51             if(tmp<minn) zz=b[i],xx=b[i+1],minn=tmp;
52             if(tmp>maxx) gg=b[i],bb=b[i+1],maxx=tmp;
53         }
54         if(!maxx)
55          printf("There are no adjacent primes.\n");
56         else printf("%d,%d are closest, %d,%d are most distant.\n",zz,xx,gg,bb); 
57     }
58     return 0;
59 } 
View Code

 

posted @ 2018-09-27 09:08  cellur925&Chemist  阅读(161)  评论(0编辑  收藏  举报