poj 2689 巧妙地运用素数筛选

poj 2689 巧妙地运用素数筛选

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

称号:

   给出一个区间[L,R]求在该区间内的素数最短,最长距离。 (R < 2 * 10^9 , R – L <= 10 ^ 6)

   由数论知识可得一个数的因子可在开根号内得到。

所以,我们能够打出5*10^4内得素数。然后,在用一次筛法把在[L。R]内得合数找到,则剩下的就是素数了。这里要用到离散化。把一个数 x – L 保存在数组里。由于,直接保存肯定不行。可是我们发现区间特点较小。所以。能够想到离散化。

 

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

typedef long long LL;
const int MAXN = 50000;
int primes[MAXN];
bool vst[MAXN];
int notPrimes[1000010];
int pos[1000010];
int top,pcnt;

void init(){
    top = 0;
    memset(vst,0,sizeof(vst));
    vst[0] = vst[1] = 1;
    for(int i = 2;i < MAXN;++i)if(!vst[i]){
        primes[top++] = i;
        for(int j = i + i;j < MAXN;j += i) vst[j] = 1;
    }
    //printf("top: %d\n",top);
}

void solve(int L,int R){
    memset(notPrimes,0,sizeof(notPrimes));

    if(L == 1) L = 2;              /// 防止筛掉全部该区间的素数本身!!!!!
    for(int i = 0;i < top&&(LL)primes[i]*primes[i] <= R;++i){  //筛选因子
        int s = L / primes[i] + (L % primes[i] > 0); //当前素数的最小倍数达到L
       
        s = (s == 1 ? 2 : s);    /// 防止筛掉全部该区间的素数本身!!!!!
       
        for(int j = s;(LL)j*primes[i] <= R;++j){
            if((LL)j*primes[i] >= L)   //合数
               notPrimes[j*primes[i] - L] = 1;   // 相当与离散化
        }
    }

    pcnt = 0;
    for(int i = 0;i <= R - L;++i){
        if(!notPrimes[i]){
            pos[pcnt++] = i + L;
            //printf("i -- > %d\n",i + L);
        }
    }
    
    
    if(pcnt < 2){
        puts("There are no adjacent primes.");
    } else {
        int minl,minr,maxl,maxr,minv = 999999,maxv = -1;
        for(int i = 1;i < pcnt;++i){
            if(pos[i] - pos[i-1] > maxv){
                maxv = pos[i] - pos[i-1];
                maxl = pos[i-1];
                maxr = pos[i];
            }
            if(pos[i] - pos[i-1] < minv){
                minv = pos[i] - pos[i-1];
                minl = pos[i-1];
                minr = pos[i];
            }
        }
        printf("%d,%d are closest, %d,%d are most distant.\n",minl,minr,maxl,maxr);
    }
}
int main()
{
    init();
    int L,R;
    while(~scanf("%d%d",&L,&R)){
        solve(L,R);
    }
    return 0;
}




 

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117277.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月8日 上午11:00
下一篇 2022年1月8日 下午12:00


相关推荐

  • java partial class_C partial 说明

    java partial class_C partial 说明1 什么是局部类型 C 2 0 引入了局部类型的概念 局部类型允许我们将一个类 结构或接口分成几个部分 分别实现在几个不同的 cs 文件中 局部类型适用于以下情况 1 类型特别大 不宜放在一个文件中实现 2 一个类型中的一部分代码为自动化工具生成的代码 不宜与我们自己编写的代码混合在一起 3 需要多人合作编写一个类 局部类型是一个纯语言层的编译处理 不影响任何执行机制 事实上 C 编

    2026年3月16日
    3
  • flutter byte(Unit8List) 转 ios Uint8[] 转 c语言char*

    flutter byte(Unit8List) 转 ios Uint8[] 转 c语言char*最近用flutter写ios线上项目,有一个功能让把设备传来的数据加密,而这个坑爹的加密的方法是c语言写的,用flutter各种尝试,始终不能还原c的加密过程,只能调用ios原生代码,然后用原生代码调用c语言加密,然后将加密的数据返回过程是这么个过程,但是3种语言的类型各不相同,所以中间就出现来各种转换,本人一个安卓屌丝,碰到swift和c语言也是一脸懵逼,很简单的东西我搞了2天,先看…

    2025年12月6日
    4
  • 字符串-AC自动机(详细图解)

    字符串-AC自动机(详细图解)HDU 2222Keywords 2896 病毒侵袭 HDU 3065 病毒侵袭持续中 POJ 2778DNASeque 2296RingAC 自动机模板 AC 自动机 Aho Corasickauto 是 KMP 的升级版 即 KMP 是单模匹配算法 处理一个文本串中查找一个模式串的问题 而 AC 自动机能在一个文本串中同时查找多个不同的模式串 是多模匹配算法

    2026年3月18日
    2
  • python endswith函数_Python的startswith和endswith

    python endswith函数_Python的startswith和endswith做文本处理的时候经常要判断一个文本有没有以一个子串开始,或者结束。Python为此提供了两个函数:S.startswith(prefix[,start[,end]])->bool如果字符串S以prefix开始,返回True,否则返回False。start和end是两个可以缺省的参数。分别是开始比较的位置和结束比较的位置。这个函数也可以写成S[start:end].startswith(pr…

    2025年6月3日
    11
  • 跟着IT彭于晏学JAVA之面向对象

    跟着IT彭于晏学JAVA之面向对象1 什么是面向对象面向过程 我应该干什么重在过程事务执行者 挑选一个电脑 台式 1 挑一个 cpuIntelCore 2 挑一个主板华硕 3 挑一个显卡七彩虹影驰 9600GT 4 挑一个显示器面向对象 重点在对象我该找谁干什么指挥者 找一个懂电脑的人帮你去买电脑 更贴近人的思维 懒人思维 2 面向对象的好处面向对象

    2026年3月17日
    2
  • git拉取代码错误

    git拉取代码错误记录一下拉取 git 服务器的代码到本地输入命令 gitpull 报错如下 图片上的信息表示 查看 https aka ms gcmcore tlsverify 后 发现应该是缺少了安全认证 所以解决方法是重启安全认证 百度之后 输入命令 gitconfigglo sslVerifytru 再输入命令 gitpull 这时 又报出新的错误 出现这种问题 是由于有人在 git 服务器上直接修改文件 致使从 gitpull 最新代码会提示这样的问题 因为想彻底地覆盖本地的代码

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号