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 }
独立意志与自由思想是必须争的,且须以生死力争。