这道题的L和R都很大,所以如果直接开一个1~R的数组明显会超时。但是R-L并不大,所以我们考虑把这个区间(L--R)移动到(1--(R-L+1))这个区间再开数组(就是把每个数减L再加1)。接下来先用埃氏筛分(可以自行百度)求出【2,√R】区间的素数,并存在prime数组里。对于prime数组里的每一个质数,求出其在区间(L--R)的倍数并且标记成false(非素数)。那么剩下的区间(L--R)里的数就都是素数咯~然后相邻的比较,求出差最大的和差最小的即可。

注意的细节:1.判断素数的数组(prime是用来储存素数数据的,用long long)isprime[],和 a[] 最好用bool,节省空间。

      2.这道题非bool的数据类型最好都开long long的,不然大的数据点会RE。

      3.注意左区间是“1”的情况,“1”是非素数。

下面给出代码:(必要的有注释)

 #include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll prime[],cnt;//prime存储【2,√R】区间的素数,cnt记录该区间素数个数
bool isprime[];//isprime:初始判断 【2,√R】区间的素数
bool a[];//原区间左右至(1~(R-L+1)) 后,判断素数
ll l,r;
void ini()
{
memset(isprime,,sizeof(isprime));
isprime[]=isprime[]=;
memset(a,,sizeof(a));
}
void sushu()//初始用埃氏筛法,筛选 【2,√R】区间的素数
{
for (ll i=;i*i<=r;i++)
{
if (isprime[i])
{
prime[cnt++]=i;
for (ll j=i*i;j*j<=r;j+=i)
isprime[j]=;
}
}
}
void sift()//筛选区间内的素数
{
for (ll i=;i<cnt;i++)
{
ll bm=l/(ll)prime[i];
for (ll j=bm*(ll)prime[i];j<=r;j+=(ll)prime[i])
if ((j)!=(ll)prime[i]) a[j-l+]=;
}
if (l==) a[]=;//注意“1”不是素数
}
void minus()//相邻素数求差最大和差最小
{
ll pre=,minans=,maxans=,x1,x2,y1,y2;
for (ll i=;i<=(r-l+);i++)
{
if (a[i])
{
if (pre)
{
if (i-pre > maxans)
maxans=i-pre,x1=pre,x2=i;
if (i-pre < minans)
minans=i-pre,y1=pre,y2=i;
}
pre=i;
}
}
if (maxans && minans!=)
printf("%lld,%lld are closest, %lld,%lld are most distant.\n",(ll)y1+l-,(ll)y2+l-,(ll)x1+l-,(ll)x2+l-);
else printf("There are no adjacent primes.\n");
}
int main()
{
while (scanf ("%lld%lld",&l,&r)!=EOF)
{
ini();
sushu();
sift();
minus();
}
return ;
}

poj 2689Prime Distance(区间素数)埃氏筛法的更多相关文章

  1. GDUFE-OJ 1359校庆素数 埃氏筛法

    Problem Description: 包含33的素数称为校庆素数. 她想知道在L和R之间(包含L和R)有多少个校庆素数. 比如 2333 就是一个校庆素数. Input: 输入的第一行包括一个T( ...

  2. POJ-2689 Prime Distance,区间素数筛法

                                                    Prime Distance 只会埃氏筛法的弱鸡今天读了读挑战程序设计120页,明白了求小区间内素数的方 ...

  3. 素数判断-----埃氏筛法&欧拉筛法

    埃氏筛法 /* |埃式筛法| |快速筛选素数| |15-7-26| */ #include <iostream> #include <cstdio> using namespa ...

  4. 埃氏筛法求素数&构造素数表求素数

    埃氏筛法求素数和构造素数表求素数是一个道理. 首先,列出从2开始的所有自然数,构造一个序列: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1 ...

  5. [算法]素数筛法(埃氏筛法&线性筛法)

    目录 一.素数筛的定义 二.埃氏筛法(Eratosthenes筛法) 三.线性筛法 四.一个性质 一.素数筛的定义 给定一个整数n,求出[1,n]之间的所有质数(素数),这样的问题为素数筛(素数的筛选 ...

  6. Codeforces Round #270 A. Design Tutorial: Learn from Math【数论/埃氏筛法】

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  7. DP+埃氏筛法 Codeforces Round #304 (Div. 2) D. Soldier and Number Game

    题目传送门 /* 题意:b+1,b+2,...,a 所有数的素数个数和 DP+埃氏筛法:dp[i] 记录i的素数个数和,若i是素数,则为1:否则它可以从一个数乘以素数递推过来 最后改为i之前所有素数个 ...

  8. 埃氏筛法(快速筛选n以内素数的个数)

    给你一个数n,请问n以内有多少个素数?(n <= 10e7) 一般来说,要是对一个整数进行素数判断,首先想到的是写个函数判断是否为素数,然后调用这个函数,时间复杂度为O(n^(½)),但是要求n ...

  9. poj 2689 Prime Distance (素数二次筛法)

    2689 -- Prime Distance 没怎么研究过数论,还是今天才知道有素数二次筛法这样的东西. 题意是,要求求出给定区间内相邻两个素数的最大和最小差. 二次筛法的意思其实就是先将1~sqrt ...

随机推荐

  1. 吐血整理:PyTorch项目代码与资源列表 | 资源下载

    http://www.sohu.com/a/164171974_741733   本文收集了大量基于 PyTorch 实现的代码链接,其中有适用于深度学习新手的“入门指导系列”,也有适用于老司机的论文 ...

  2. WinDbg调试分析 net站点 CPU100%问题

    WinDbg调试分析 asp.net站点 CPU100%问题 公司为了节省成本,最近有一批服务器降了配置,CPU从8核降到了2核.本身是小站点,访问量也不高,CPU总是会飙到100%而且可以一直持续几 ...

  3. 在linux系统中I/O 调度的选择 (转)

    I/O 调度算法再各个进程竞争磁盘I/O的时候担当了裁判的角色.他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能. 在linux下面列出4种调度算法 CFQ (Completel ...

  4. 为CentOS配置网易163的yum源

    Yum (Yellow dog Updater, Modified)是一个基于 RPM 包管理的字符前端软件包管理器.能够从指定的服务器自动下载 RPM 包并且安装,可以处理依赖性关系,并且一次安装所 ...

  5. 多媒体开发之---live555的多线程支持,原本只是单线程,单通道

    1)我对Live555进行了一次封装,但是Live555 是单线程的,里面定义的全局变量太多,我封装好dll库后,在客户端调用,因为多个对话框中要使用码流,我就定义了多个对象从设备端接收码流,建立多个 ...

  6. Windows App开发之经常使用控件与应用栏

    控件的属性.事件与样式资源 怎样加入控件 加入控件的方式有多种,大家更喜欢以下哪一种呢? 1)使用诸如Blend for Visual Studio或Microsoft Visual Studio X ...

  7. toggle不支持事件代理的解决办法或者 jquery live绑定toggle

    $(".xxx").live("click", function () {      $(this).toggle(function () {},functio ...

  8. python使用记录

    #2017-7-17 1.用len()函数可以获得list元素的个数; len()可以获取字符串长度 2. list正向0开始索引,,逆向-1开始索引; 也可以把元素插入到指定的位置,比如索引号为1的 ...

  9. Spring-data-redis:特性与实例(转载)

    原文地址:http://www.cnblogs.com/davidwang456/p/4915109.html Spring-data-redis为spring-data模块中对redis的支持部分, ...

  10. 通过JMX获取weblogic的监控指标

    通过JMX获取weblogic的监控数据,包括JDBC,SESSION,SERVERLET,JVM等信息.主要用到weblogic自己的t3协议,所以要用到weblogic的jar包:wlfullcl ...