POJ 2689 Prime Distance(素数筛选)
题意:输入区间[l,u],其中l和u为int范围的整数,区间最大为1000000。求出[l,u]中,相邻素数只差最大和最小的素数对。当存在多个时,输出较小的素数对。
#include <iostream> #include <cstdio> #include <cstring> #define ll long long using namespace std; const int maxm=1e6+10; const int maxn=1e5+100; int prime[maxn]; bool vis[maxn]; int a,b; int tot=0; void is_prime() { memset(prime,0,sizeof(prime)); for(int i=2;i<=maxn;i++) { if(!prime[i]) prime[++prime[0]]=i; for(ll j=1;j<=prime[0]&&prime[j]<=maxn/i;j++) { prime[i*prime[j]]=1; if(i%prime[j]==0) break; } } } bool notprime[maxm]; int prime2[maxm]; void is_prime2(int L,int R) { memset(notprime,false,sizeof(notprime)); if(L<2) L=2; for(int i=1;i<=prime[0]&&(long long)prime[i]*prime[i]<=R;i++) { int s=L/prime[i]+(L%prime[i]>0); if(s==1) s=2; for(int j=s;(long long)j*prime[i]<=R;j++) { if((long long)j*prime[i]>=L) notprime[j*prime[i]-L]=true; } } prime2[0]=0; for(int i=0;i<=R-L;i++) { if(!notprime[i]) { prime2[++prime2[0]]=i+L; } } } int main() { is_prime(); while(~scanf("%d%d",&a,&b)){ is_prime2(a,b); if(prime2[0]<2) printf("There are no adjacent primes.\n"); else{ int x1=0,x2=100000000,y1=0,y2=0; for(int j=1;j<prime2[0];j++) { if(prime2[j+1]-prime2[j]<x2-x1) { x1=prime2[j]; x2=prime2[j+1]; } if(prime2[j+1]-prime2[j]>y2-y1) { y1=prime2[j]; y2=prime2[j+1]; } } printf("%d,%d are closest, %d,%d are most distant.\n",x1,x2,y1,y2); } } return 0; }