题目描述:

给定两个整数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. HTML5离线缓存攻击测试

    本实验采用局域网模拟,通过修改本地HOSTS文件来模拟域名以及DNS欺骗.合法网站使用Linux CentOS7的apache服务器搭建,IP为192.168.1.113,HOSTS文件中加入192. ...

  2. CentOS 7使用yum快速搭建LAMP环境

    1.安装Apache [root@localhost ~]# yum -y install httpd # 开机自启动 [root@localhost ~]# chkconfig httpd on # ...

  3. Android卡片设置透明度失效问题

    最近在做蓝牙电话项目,需要支持双路通话,涉及到通话卡片透明度调节,当正在通话中,有新的来电时,原来的通话卡片需要做成30%的透明度,本来很简单的一个小改进,但通过 setAlpha()接口总是失效!  ...

  4. 栈内存不是只有2M吗?为什么不溢出?

    #include <stdio.h> #include <wchar.h> #include <stdlib.h> #define MAX_PATH 1024 FI ...

  5. Z Order of Controls in Delphi FireMonkey(Tom Yu的博客)

    Get and set the Z Order of controls at runtime in Delphi FireMonkey. This is a follow on to my earli ...

  6. .NET中扩展方法和Enumerable(System.Linq)

    LINQ是我最喜欢的功能之一,程序中到处是data.Where(x=x>5).Select(x)等等的代码,她使代码看起来更好,更容易编写,使用起来也超级方便,foreach使循环更加容易,而不 ...

  7. spring之@Value详解(转载)

    @Value注入 不通过配置文件的注入属性的情况 通过@Value将外部的值动态注入到Bean中,使用的情况有: 注入普通字符串 注入操作系统属性 注入表达式结果 注入其他Bean属性:注入beanI ...

  8. 从电子游戏到DevOps

    在一个项目团队中,开发与运维之间的关系像极了知名大型游戏<刺客信条>里的故事:开发就是追求自由的刺客联盟——我喜欢用各种新颖技术手段去满足用户爸爸那些花里胡哨的需求,你别管那技术好不好用, ...

  9. c++汉诺塔相关知识总结1

    困扰已久,难以攻克的汉诺塔总结来啦 Part One 汉诺塔到底是什么呢? 汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金 ...

  10. mongodb批量更新操作文档的数组键

    persons文档的数据如下: > db.persons.find(){ "_id" : 2, "name" : 2 }{ "_id" ...