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;
}




 

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Ubuntu根分区使用Lvm扩容

    Ubuntu根分区使用Lvm扩容ubuntu根分区剩余空间不足,影响工作,因此通过lvm工具对根文件系统进行扩容系统版本:ubuntu-14.04LTS1.使用新硬盘扩展根文件系统 新建一块硬盘并进行分区: fdisk/dev/sde 依次键入n,创建新分区;然后分区类型选择p;其他默认输入即可。 图1:创建新分区 分区创建完成后,修改分区类型为lvm: 图2:修改分区类型 新建的分区类型不能为扩展分区,否则不能更改分区类型,目前还不清楚原因,需要继续查找其他资料,..

  • doxygen教程_genedoc教程

    doxygen教程_genedoc教程综述 我们在编写代码的时候,最头疼的就属于说明书了,很多代码一边写具体代码,一边写说明书,Doxygen主要解决说明书问题,可以在我们写代码的时候讲注释转化为说明书,Graphviz主要是用于图形展示,htmlhelpworkshop主要使用生成CHM文档。1.Doxygen Doxygen能将程序中的特定批注转换成为说明文件。它可以依据程序本身的结构,将程序中按规范注释的批注经过处理…

    2022年10月31日
  • PHP服务器端API原理及示例讲解(接口开发)

    PHP服务器端API原理及示例讲解(接口开发)

    2021年10月18日
  • 世界十大量化交易模型_如何防止量化模型被窃取

    世界十大量化交易模型_如何防止量化模型被窃取01、股票多空策略股票多空策略(EquityLong/Short),即买一些股票,通过融券的方式去卖空一些股票,然后再用一些股指期货进行对冲。这是国际上主流的HedgeFund所用的量化策略,据知名数据商Eurekahedge的统计数据,在国际对冲基金中长期占比第一(一直超过30%)。比如2011年获得美国量化基金业评比第一名的贝莱德“32Cap全球对冲基金产品”使用的就是经典的多空策略…

  • 人工智能 – 五子棋人机对战

    人工智能 – 五子棋人机对战人工智能 – 五子棋人机对战作者:jig    阅读人次:6635    文章来源:本站原创    发布时间:2007-7-12    网友评论(8)条 
    原帖及讨论:http://bbs.bccn.net/thread-154777-1-1.html
    */————————————————————————————–
    */出自:编程中国  http://www.

  • matlab 二分法区间,多区间二分法[通俗易懂]

    &nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp预备知识 二分法这里介绍一种多区间二分法,可以求出连续函数在某区间内几乎全部的根.方法就是把这个区间等分为若干个相等的小区间,然后分别判断这些小区间两端函数值的符号,对所有两端异号的区间使用二分法即可.显然,小区间的个数越多,越有可能找到所有的根.例程如下.代码1:bis…

发表回复

您的电子邮箱地址不会被公开。

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