zoukankan      html  css  js  c++  java
  • [题解](区间质数筛)POJ_2689 Prime Distance

    区间筛素数:先筛出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.
    ");
            else printf("%d,%d are closest, %d,%d are most distant.
    ",xb,yb,xa,ya);
        }
    }
  • 相关阅读:
    改造二叉树
    汽车加油行驶问题
    [SHOI2012]回家的路
    子串
    P3558 [POI2013]BAJ-Bytecomputer
    HDU
    UVALive
    ZOJ
    HDU
    牛客小白月赛2 题解
  • 原文地址:https://www.cnblogs.com/superminivan/p/10846146.html
Copyright © 2011-2022 走看看