http://poj.org/problem?id=2689

题目大意,给不超过int的l,r,其中r-l+1<=1000000,筛出其中的素数,并且求出相邻素数差值最大和最小的一对。

——————————————————

显然这是一道筛出l和r之间素数的裸题。

我们发现对于区间里的一个合数,其最大质因子不会超过50000(不然50000平方就大于2147483647)

秉承着正难则反的思想,筛1-50000素数,然后用一种很神奇的方法判断掉区间里的合数,统计素数即可。

判断方法:

首先我们将每个素数(记为su)平方得到t,一定是合数。

如果发现其<l。

我们就可以t=l/su*su,得到的也一定是合数。

如果此时仍然<l,我们为t+=su,得到的还是合数。

当然如果超了r那就continue;

然后对于t打标记。

然后不断地t+=su直到超r为止。

可以发现一定能够筛全合数。

简略证明:

不断地加相当于乘。

所以实际上我们在做的就是(例如su=2),就是2*2,2*3,2*4,2*5……这些全是合数。

而且因为起点是平方,所以避免了3*2这样的重复产生,所以更加的快捷。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
const int INF=;
int su[]={};
bool he[]={};
int cnt=;
bool vis[]={};
void Euler(int n){
for(int i=;i<=n;i++){
if(he[i]==){
cnt++;
su[cnt]=i;
}
for(int j=;j<=cnt&&i*su[j]<=n;j++){
he[su[j]*i]=;
if(i%su[j]==)break;
}
}
return;
}
int main(){
Euler();
int l,r;
while(scanf("%d%d",&l,&r)!=EOF){
memset(vis,,sizeof(vis));
int ans=;
for(int i=;i<=cnt&&su[i]<=sqrt(r);i++){
//t接下来无论怎么变都是合数
int t=su[i]*su[i];
if(t<l)t=l/su[i]*su[i];//t太小的时候就得这样让它变大点
if(t<l){
if(t<=r-su[i]){
t+=su[i];
}else continue;
}
while(t<=r){
vis[t-l]=;
if(t==su[i])vis[t-l]=;//压缩空间
if(t<=r-su[i])t+=su[i];
else break;
}
}
if(l==)vis[]=;
int p=-;
int x1,y1,x2,y2,ans1=-,ans2=INF;
for(int i=;i<=r-l;i++){
if(!vis[i]){
if(p==-){p=i;continue;}
if(ans1<i-p){ans1=i-p;x1=p+l;y1=i+l;}
if(ans2>i-p){ans2=i-p;x2=p+l;y2=i+l;}
p=i;
}
}
if(ans1==-)cout<<"There are no adjacent primes."<<endl;
else cout<<x2<<","<<y2<<" are closest, "<<x1<<","<<y1<<" are most distant."<<endl;
}
return ;
}

POJ2689:Prime Distance——题解的更多相关文章

  1. poj2689 Prime Distance题解报告

    题目戳这里 [题目大意] 给定一个区间[L,R],求区间内的质数相邻两个距离最大和最小的. [思路分析] 其实很简单呀,很明显可以看出来是数论题,有关于质数的知识. 要注意一下的就是L和R的数据范围都 ...

  2. POJ2689 Prime Distance(数论:素数筛选模板)

    题目链接:传送门 题目: Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: Accepted: Des ...

  3. POJ-2689 Prime Distance (两重筛素数,区间平移)

    Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13961   Accepted: 3725 D ...

  4. 解题报告:poj2689 Prime Distance

    2017-10-03 11:29:20 writer:pprp 来源:kuangbin模板 从已经筛选好的素数中筛选出规定区间的素数 /* *prime DIstance *给出一个区间[L,U],找 ...

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

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

  6. POJ2689 - Prime Distance(素数筛选)

    题目大意 给定两个数L和U,要求你求出在区间[L, U] 内所有素数中,相邻两个素数差值最小的两个素数C1和C2以及相邻两个素数差值最大的两个素数D1和D2,并且L-U<1,000,000 题解 ...

  7. POJ2689:Prime Distance(大数区间素数筛)

    The branch of mathematics called number theory is about properties of numbers. One of the areas that ...

  8. POJ2689 Prime Distance 质数筛选

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

  9. poj2689 Prime Distance(素数区间筛法)

    题目链接:http://poj.org/problem?id=2689 题目大意:输入两个数L和U(1<=L<U<=2 147 483 647),要找出两个相邻素数C1和C2(L&l ...

随机推荐

  1. andriod学习二 设置开发环境

    1.官方环境搭建步骤     http://developer.android.com/sdk/installing/index.html         包括:下载JDK6,Eclipse 3.6, ...

  2. nuget在jenkins上不能自动还原项目依赖包---笔记

    最近遇到一个情况,IDE 是 VS2015 Update3 ,新建一个library项目(暂时叫做 mytests),然后用 nuget 安装了一个 Shouldly 包 在 VS 上一切正常,可以跑 ...

  3. windows安装logstash-input-jdbc并使用其导入MMSQL数据

    1.安装logstash 2.修改logstash 文件夹下Gemfile文件 将source改为:https://gems.ruby-china.org 3.进入bin目录 执行logstash-p ...

  4. editText设置最大长度

    xml中可以设置为: <EditText android:layout_width = "fill_parent" android:layout_height = " ...

  5. python操作字符串内容并重新输出

    今天在做一个函数的作业,题目如下: 编写一个函数实现大写转小写,小写变大写,并且转换为镜像字符串,并且将字符串变为镜像字符串. 例如:’A’变为’Z’,’b’变为’y 示范字符串: ”sdSdsfdA ...

  6. Linux命令应用大词典-第24章 任务计划

    24.1 contab:针对个人用户维护crontab文件

  7. 第五模块·WEB开发基础-第3章jQuery&Bootstrap

    01-jQuery介绍 02-如何使用jQuery 03-jQuery的入口函数 04-jQuery对象和JS对象的相互转换 05-jQuery如何操作DOM 06-底层选择器 07-基本过滤器 08 ...

  8. kafka stream 低级别的Processor API动态生成拓扑图

    public class KafkaSream { public static void main(String[] args) { Map<String, Object> props = ...

  9. ChromeSwitchySharp代理设置步骤

    步骤: 1.新增情景模式配置如下:   2.设置切换规则   3.先“直接连接”进行登录:然后切换到“自动切换模式”访问对应url

  10. iOS-开发将文本复制到剪切板

    下面方法可以将文本复制到剪切板 UIPasteboard *pboard = [UIPasteboard generalPasteboard]; pboard.string = @"邀请码& ...