标签:
Description
Input
Output
Sample Input
2 17 14 17
Sample Output
2,3 are closest, 7,11 are most distant. There are no adjacent primes.
#include<cstdio> #include<cstring> #include<stack> #include<queue> #include<cmath> #include<set> #include<vector> #include<iostream> #include<map> #include<string> #include<algorithm> using namespace std; typedef double db; typedef long long ll; typedef unsigned long long ull; const int N=50005; bool vis[N]; bool notprime[N*20]; ll proprimes[N],len; ll primes[N*20]; pair<ll,ll>minans,maxans; void getprim() { for(int i=2;i*i<N;i++) for(int j=i+i;j<N;j+=i) vis[j]=1; for(int i=2;i<N;i++) if(!vis[i])proprimes[len++]=i; } void solve(ll L,ll U) { memset(notprime,0,sizeof(notprime)); for(int i=0;i<len;i++) { ll b=L/proprimes[i]; while(b*proprimes[i]<L||b<=1)b++; for(ll j=b*proprimes[i];j<=U;j+=proprimes[i]) notprime[j-L]=1; } int t=0; if(L==1)notprime[0]=1; for(ll i=L;i<=U;i++) { if(!notprime[i-L]) primes[t++]=i; } if(t<=1){puts("There are no adjacent primes.");return;} int mindist=1000005,maxdist=-1; for(int i=1;i<t;i++) { if(primes[i]-primes[i-1]>maxdist) maxdist=primes[i]-primes[i-1],maxans.first=primes[i-1],maxans.second=primes[i]; if(primes[i]-primes[i-1]<mindist) mindist=primes[i]-primes[i-1],minans.first=primes[i-1],minans.second=primes[i]; } printf("%lld,%lld are closest, %lld,%lld are most distant.\n",minans.first,minans.second,maxans.first,maxans.second); } int main() { ll L,U; getprim(); while(~scanf("%lld%lld",&L,&U))solve(L,U); return 0; }
标签:
原文地址:http://www.cnblogs.com/homura/p/5350320.html