标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 15820 | Accepted: 4202 |
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.
注意:L可能为1
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long ll; const int MAXN=1000005; const int INF=0x7f7f7f7f; int l,u; int prime[MAXN],top; bool isPrime_small[MAXN]; bool isPrime[MAXN]; void segment_sieve() { memset(isPrime_small,true,sizeof(isPrime_small)); memset(isPrime,true,sizeof(isPrime)); isPrime_small[1]=false; for(ll i=2;i*i<=u;i++) //注意防止i,j溢出,要设为long long { if(isPrime_small[i]) { for(ll j=i+i;j*j<=u;j+=i) isPrime_small[j]=false; for(ll j=max(((l+i-1)/i)*i,2*i);j<=u;j+=i) isPrime[j-l]=false; } } } void sieve() { for(ll i=l;i<=u;i++) { if(isPrime[i-l]) prime[top++]=i; } } int main() { while(scanf("%d%d",&l,&u)!=EOF) { if(l==1) l++; top=0; segment_sieve(); sieve(); if(top<=1) { printf("There are no adjacent primes.\n"); } else { int a,b; int mn=INF; int c,d; int mx=0; for(int i=1;i<top;i++) { if(prime[i]-prime[i-1]<mn) { a=prime[i-1]; b=prime[i]; mn=b-a; } if(prime[i]-prime[i-1]>mx) { c=prime[i-1]; d=prime[i]; mx=d-c; } } printf("%d,%d are closest, %d,%d are most distant.\n",a,b,c,d); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/program-ccc/p/5483847.html