区间筛素数:先筛出1~sqrt(R)的素数,然后对于每个询问只要用这些素数筛掉区间内的合数即可。
几个细节:
1.特判和1有关的一些情况
2.每次减去L偏移量,数组只开区间大小
3.POJ无法使用万能头文件(需要火星救援(大雾
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int prime[50009]; bool ck[1000009],tmp[1000009]; int l,r,tot; int main(){ for(int i=2;i<=50005;i++){ if(!ck[i])prime[++tot]=i; for(int j=1;j<tot;j++){ if(i*prime[j]>50005)break; ck[i*prime[j]]=1; if(i%prime[j]==0)break; } } while(scanf("%d%d",&l,&r)!=EOF){ if(l==1)l=2;//特判 memset(tmp,0,sizeof(tmp)); for(int i=1;i<=tot;i++){ int a=(l-1)/prime[i]+1; int b=r/prime[i]; a=max(2,a); for(int j=a;j<=b;j++) tmp[j*prime[i]-l]=1;//减去l映射 } int lst=-1,minans=0x7fffffff,maxans=0,xa,ya,xb,yb; for(int i=0;i<=r-l;i++){ if(!tmp[i]){ if(lst==-1){lst=i;continue;} if(maxans<i-lst) maxans=i-lst,xa=lst+l,ya=i+l; if(minans>i-lst) minans=i-lst,xb=lst+l,yb=i+l; lst=i; } } if(maxans==0)printf("There are no adjacent primes.\n"); else printf("%d,%d are closest, %d,%d are most distant.\n",xb,yb,xa,ya); } }
原文地址:https://www.cnblogs.com/superminivan/p/10846146.html
时间: 2024-10-12 07:10:02