UVA10140 Prime Distance
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int maxn=1e6+10; 5 6 long long l,r,prime[maxn],vis[maxn],p[maxn],a[maxn]; 7 int tot=0; 8 9 int pre(long long n) 10 { 11 for(int i=2;i<=n;i++) 12 { 13 if(!vis[i]) 14 { 15 vis[i]=i; 16 prime[++tot]=i; 17 } 18 for(int j=1;j<=tot;j++) 19 { 20 if(i*prime[j]>n) 21 { 22 break; 23 } 24 if(prime[j]>vis[i]) 25 { 26 break; 27 } 28 vis[i*prime[j]]=prime[j]; 29 } 30 } 31 } 32 int main() 33 { 34 pre(5e4+10); 35 while(cin>>l>>r) 36 { 37 memset(p,0,sizeof(p)); 38 if(l==1) 39 { 40 l=2; 41 } 42 long long cnt=0,min1,min2,max1,max2,minn=0x3f3f3f3f,maxx=-0x3f3f3f3f; 43 for(int j=1;j<=tot;j++) 44 { 45 for(int i=l/prime[j];i<=r/prime[j];i++) 46 { 47 while(i<=1) 48 { 49 i++; 50 } 51 if(prime[j]*i<l||prime[j]*i>r) 52 { 53 continue; 54 } 55 p[prime[j]*i-l]=1; 56 } 57 } 58 for(int i=l;i<=r;i++) 59 { 60 if(p[i-l]==0) 61 { 62 a[++cnt]=i; 63 } 64 } 65 if(cnt<=1) 66 { 67 //cout<<cnt<<endl; 68 cout<<"There are no adjacent primes."<<endl; 69 continue; 70 } 71 for(int i=1;i<=cnt-1;i++) 72 { 73 if(a[i+1]-a[i]<minn) 74 { 75 minn=a[i+1]-a[i]; 76 min1=a[i+1]; 77 min2=a[i]; 78 } 79 if(a[i+1]-a[i]>maxx) 80 { 81 maxx=a[i+1]-a[i]; 82 max1=a[i+1]; 83 max2=a[i]; 84 } 85 } 86 //cout<<cnt<<endl; 87 cout<<min2<<","<<min1<<" are closest, "<<max2<<","<<max1<<" are most distant."<<endl; 88 } 89 return 0; 90 }