题目描述:

给定两个整数L和U,你需要在闭区间[L,U]内找到距离最接近的两个相邻质数C1和C2(即C2-C1是最小的),如果存在相同距离的其他相邻质数对,则输出第一对。

同时,你还需要找到距离最远的两个相邻质数D1和D2(即D1-D2是最大的),如果存在相同距离的其他相邻质数对,则输出第一对。

输入格式:

每行输入两个整数L和U,其中L和U的差值不会超过1000000。

输出格式:

对于每个L和U ,输出一个结果,结果占一行。

结果包括距离最近的相邻质数对和距离最远的相邻质数对。(具体格式参照样例)

如果L和U之间不存在质数对,则输出“There are no adjacent primes.”。

数据范围:

1≤L<U≤231-1,R-L≤106

输入样例:

2 17

14 17

输出样例:

2,3 are closest, 7,11 are most distant.
There are no adjacent primes.

思路:

①用筛法求出2~sqrt(R)之间的所有质数。

②标记i*p(ceil(L/p)≤i≤floor(R/p))。

③所有未标记的数就是[L,R]中的质数。对相邻的质数两两比较,找出差最大的。

时间复杂度:O(∑质数p≤sqrt(R)(R-L)/p)=O(sqrt(R)log log sqrt(R)+(R-L)log log R)。

代码如下:

#include<bits/stdc++.h>
#define N 1000000+10
#define M 100000+10
using namespace std;

int l,r,m;
int v[M],prime[M];
bool st[N];

void primes(int n){//线性筛质数
    memset(v,,sizeof(v));
    m=;
    ;i<=n;i++){
        ){
            v[i]=i;
            prime[++m]=i;
        }

        ;j<=m;j++){
            if(prime[j]>v[i]||prime[j]>n/i)break;
            v[i*prime[j]]=prime[j];
        }
    }
}

int main(){
    primes();//step 1 

    while(cin>>l>>r){
        memset(st,true,sizeof(st));
        )st[]=false;

        ;prime[i]<=sqrt(r);i++){
            int p=prime[i];

            int l1,r1;
            )l1=l/p;
            ;
            r1=floor(r/p);

            ,l1);j<=r1;j++)
                st[j*p-l]=false;//step 2
        }

        ,min2=-,max1=-,max2=-;
        ;
        int before;
        bool t=false;

        ;i<=r-l;i++){
            if(!st[i])continue;

            if(!t){
                before=i;t=true;
            }

            else{
                if(i-before>maxx){
                    max1=before;max2=i;
                    maxx=i-before;
                }

                if(i-before<minn){
                    min1=before;min2=i;
                    minn=i-before;
                }

                before=i;
            }
        }//step 3

        )cout<<"There are no adjacent primes."<<endl;
        else{
            cout<<min1+l<<","<<min2+l<<" are closest, "
                <<max1+l<<","<<max2+l<<" are most distant."<<endl;
        }
    }

    ;
} 

0x31 prime distance(质数)的更多相关文章

  1. POJ2689 Prime Distance 质数筛选

    题目大意 求区间[L, R]中距离最大和最小的两对相邻质数.R<2^31, R-L<1e6. 总体思路 本题数据很大.求sqrt(R)的所有质数,用这些质数乘以j, j+1, j+2... ...

  2. 一本通1619【例 1】Prime Distance

    1619: [例 1]Prime Distance 题目描述 原题来自:Waterloo local,题面详见 POJ 2689 给定两个整数 L,R,求闭区间 [L,R] 中相邻两个质数差值最小的数 ...

  3. UVA10140 Prime Distance

    UVA10140 Prime Distance 给定两个整数L,R(1<=L<=R<=2^{31},R-L<=10^6)L,R(1<=L<=R<=231,R− ...

  4. ZOJ 1842 Prime Distance(素数筛选法2次使用)

    Prime Distance Time Limit: 2 Seconds      Memory Limit: 65536 KB The branch of mathematics called nu ...

  5. 【题解】UVA10140 [Prime Distance]

    [题解]UVA10140 Prime Distance 哈哈哈哈\(miller-rabbin\)水过去了哈哈哈 还能怎么办呢?\(miller-rabbin\)直接搞.枚举即可,还跑得飞快. 当然此 ...

  6. 数论 - 素数的运用 --- poj 2689 : Prime Distance

    Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12512   Accepted: 3340 D ...

  7. UVA 10140 - Prime Distance(数论)

    10140 - Prime Distance 题目链接 题意:求[l,r]区间内近期和最远的素数对. 思路:素数打表,打到sqrt(Max)就可以,然后利用大的表去筛素数.因为[l, r]最多100W ...

  8. poj 2689 Prime Distance(大区间素数)

    题目链接:poj 2689 Prime Distance 题意: 给你一个很大的区间(区间差不超过100w),让你找出这个区间的相邻最大和最小的两对素数 题解: 正向去找这个区间的素数会超时,我们考虑 ...

  9. [POJ268] Prime Distance(素数筛)

    /* * 二次筛素数 * POJ268----Prime Distance(数论,素数筛) */ #include<cstdio> #include<vector> using ...

随机推荐

  1. .Net 通过Cmd执行Adb命令 /c参数

    通过cmd.exe来执行adb命令,可以进行一些命令组合,直接用adb.exe的话只能执行单个adb命令 这里要注意cmd 中的/c参数,指明此参数时,他将执行整个字符串中包含的命令并退出当前cmd运 ...

  2. 修改Android Studio默认的API Level(SDK版本)

    原文:修改Android Studio默认的API Level(SDK版本) Android Studio(2.1.2)新建工程的时候只会让你选择最低支持的SDK版本,默认的目标编译SDK版本会以系统 ...

  3. 毕设(五)ListView

    ListView 控件可使用四种不同视图显示项目.通过此控件,可将项目组成带有或不带有列标头的列,并显示伴随的图标和文本. 可使用 ListView 控件将称作 ListItem 对象的列表条目组织成 ...

  4. new和delete必须成对出现吗?【网上集合贴+个人总结】

    new和delete必须成对出现吗?[网上集合贴+个人总结] 1.从内存泄露与否的角度考虑 new 和 delete不一定要成对出現.理论上是這樣的.但是从习惯上來說,new delete成對出現是一 ...

  5. MiTeC System Information Component Suite 10.9.2 D5-XE3 Full Source

    The most complex system information probe in Delphi world, it consists of many standalone components ...

  6. 什么水平算精通C++ Builder?

    主 题:   大家讨论一下什么水平算精通C++ Builder?(我这样算什么,马上要毕业了,不知道如何评价自己)         //C++ builder 使用时间3年 熟悉VCL源代码 开发过3 ...

  7. windows Service 之调试过程(附加到进程里调试,而且启动时间不能超过30秒)

    最近第一次用C#写了一个windows service ,其实实现的内容比较简单.就是启动remoting 连接,但是调试相对初次写windws service 的我来说,比较烦.没有经验,而且没办法 ...

  8. Qt发展历史及其特点简介(没有哪一种方案能够独霸Windows)

    Qt 是一个跨平台的C++应用程序框架,支持Windows.Linux.Mac OS X.Android.iOS.Windows Phone.嵌入式系统等.也就是说,Qt 可以同时支持桌面应用程序开发 ...

  9. Keepalived双主模式配置流程

    实验说明 1)keepalived 支持配置多个VRRP实例,每个实例对应一个业务 2)本次实验将实现 keepalived 的互为主备: 业务A:keepalived01为Master,keepal ...

  10. Dynamics 365 for sales - Account与Contact之间的关系

    Account :可以理解成客户,可以是公司组织,当然也可以是个人 Contact: 从字面理解为联系人 例如,腾讯公司要买我们公司的软件,他们的主要负责人是IT部门的小马,那么,腾讯要创建成Acco ...