题目链接:http://poj.org/problem?id=2689

题目大意:输入两个数L和U(1<=L<U<=2 147 483 647),要找出两个相邻素数C1和C2(L<=C1<C2<=U)是距离最小的,如果相邻素数不止一对,选择最初的,还要找出两个相邻的素数D1,和D2是距离最大的(同样在有多对的情况下选择最初的)

其中L<U,L和U的差不超过1 000 000

输入样例:

2 17
14 17

输出样例:

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

解题思路:需要求出给定范围内区间所有的素数,然后再把素数间的最大距离、最小距离求出来。所以我们首先得用筛法筛出区间[L,U]范围内的素数。

因为数据区间超过的上界打到21亿,不能将所有小于21亿的素数存下来,不过我们发现区间的长度不超过1 000 000,使用筛法筛掉[L,U]区间的所有非素数,需要知道[L,U]区间的所有非素数的素数因子(因为一个非素数是被它最小的素因子筛掉)。2 147 483 647内的数或者是素数,能被根号2 147 483 647内的素数整除,也就是说,[L,U]区间的所有非素数的素数因子都在根号2 147 483 647内。

可以预先将根号2 147 483 647内的所有素数找出来,然后用这些素数去筛掉指定区间的所有非素数

代码:

  1. #include<iostream>
  2. #include<vector>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. const int maxn=;
  9. int prime[maxn];
  10. int l,u,tot=;
  11. bool isprime[];
  12. void getprime(int N){
  13. memset(prime,,sizeof(prime));
  14. for(int i=;i<=N;i++){
  15. if(!prime[i])
  16. prime[tot++]=i;
  17. for(int j=;j<tot&&prime[j]*i<=N;j++){
  18. prime[i*prime[j]]=;
  19. if(i%prime[j]==) break;
  20. }
  21. }
  22. }
  23. int main(){
  24. getprime();
  25. while(cin>>l>>u){
  26. memset(isprime,true,sizeof(isprime));
  27. for(int i=;i<tot;i++){
  28. int a=(l-)/prime[i]+,b=u/prime[i];
  29. for(int j=a;j<=b;j++)if(j>) isprime[j*prime[i]-l]=;
  30. }
  31. if(l==) isprime[]=; //注意特判l=1的情况
  32. int pos=-,l1,r1,l2,r2,maxdis=,mindis=0x3f3f3f3f;
  33. for(int i=;i<=u-l;i++){
  34. if(isprime[i]){
  35. if(pos==-) {
  36. pos=i;
  37. continue;
  38. }
  39. if(i-pos<mindis){
  40. l1=l+pos;
  41. r1=l+i;
  42. mindis=i-pos;
  43. }
  44. if(i-pos>maxdis){
  45. maxdis=i-pos;
  46. l2=l+pos;
  47. r2=l+i;
  48. }
  49. pos=i;
  50. }
  51. }
  52. if(maxdis==) printf("There are no adjacent primes.\n");
  53. else printf("%d,%d are closest, %d,%d are most distant.\n",l1,r1,l2,r2);
  54. }
  55. return ;
  56. }

poj2689 Prime Distance(素数区间筛法)的更多相关文章

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

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

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

    链接: https://vjudge.net/problem/POJ-2689 题意: The branch of mathematics called number theory is about ...

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

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

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

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

  5. 题解报告:poj 2689 Prime Distance(区间素数筛)

    Description The branch of mathematics called number theory is about properties of numbers. One of th ...

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

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

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

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

  8. poj2689(素数区间筛法模板)

    题目链接: http://poj.org/problem?id=2689 题意: 给出一个区间 [l, r] 求其中相邻的距离最近和最远的素数对 . 其中 1 <= l <  r < ...

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

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

  10. poj2689 Prime Distance题解报告

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

随机推荐

  1. man fdisk

    FDISK(8)       Linux Programmer?. Manual/Linux程序手册       FDISK(8) NAME/名称       fdisk - Partition ta ...

  2. 【leetcode】1035. Uncrossed Lines

    题目如下: We write the integers of A and B (in the order they are given) on two separate horizontal line ...

  3. NIO编程模式示例

    1. 服务端 import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.*; im ...

  4. Listary安装+破解

    Listary 是 windows 下一个可以快速搜索所有程序,文件,并且可以快速启动程序和打开相应文件的这么一个工具,但这只是它的一个主要功能,还有其功能也是很屌的. 详细的介绍参考:[Listar ...

  5. Spring Boot 的单元测试

    Spring Boot 的单元测试 引入依赖 testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-tes ...

  6. 写一个简单易用可扩展vue表单验证插件(vue-validate-easy)

    写一个vue表单验证插件(vue-validate-easy) 需求 目标:简单易用可扩展 如何简单 开发者要做的 写了一个表单,指定一个name,指定其验证规则. 调用提交表单方法,可以获取验证成功 ...

  7. php面向对象编程(oop)基础知识示例解释

    面向对象并不是一种技术,而是一种思想,是一种解决问题的最基本的思维方式!如何理解使用?OOP:面向对象编程 (直接代码说明) 1.面向对象的基本概念 示例demo: <?php header(& ...

  8. vue2.0 之 douban (六)axios的简单使用

    由于项目中用到了豆瓣api,涉及到跨域访问,就需要在config的index.js添加代理,例如 proxyTable: { // 设置代理,解决跨域问题 '/api': { target: 'htt ...

  9. css样式表的理解

    全拼Cascading Style Sheete 美化html网页 1分为 内联样式表 和html联合显示 内嵌样式表 在单独区域内嵌,必须在head 外部样式表 需建一个css文件,保存并附加 2选 ...

  10. Vmware 15 新建虚拟机黑屏

    win10 的磁盘大小设置60的倍数 centos 使用 40g