zoukankan      html  css  js  c++  java
  • [POJ2689][Uva10140] Prime Distance 解题报告

    题目链接:--->....<---

    题意:

    给定两个整数L,R(1<=L<=R<=2^31},R-L<=10^6)L,R(1<=L<=R<=2^31,RL<=10^6),求闭区间 【l,R]中相邻两个质数的差的最小值和最大值是多少,分别输出这两个质数。

    【输入格式】

    输入有若干行,每行两个整数 L,RL,R

    【输出格式】

    对于每个L,RL,R,输出最小值和最大值,格式参照样例。若区间内无质数,输出"There are no adjacent primes."。

     思路:考虑L和R特别大,R-L特别小,所以这道题的突破口一定在R-L,我们可以“埃氏筛”或者“线性筛”筛取[1,sqrt(R)]之间的质数,然后暴力去标记[l,r]之间质数的倍数,可以证明,枚举质数到sqrt(R),可以将[1,R]中的非质数全部标记,但是需要将 [l,r] 离散成 [0,r-l] 。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<map>
    #include<cmath>
    #include<algorithm>
    #define R register
    #define ll long long int
    using namespace std;
    const int N=4e6+5;
    ll Min=1e16,Max=-1e16;
    ll l,r,num,pos,flag[N],prime[N],notprime[N];
    ll ans1[3],ans2[3],ans;
    inline void init(){
        memset(flag,0,sizeof(flag));num=0;
        memset(ans1,0,sizeof(ans1));ans=0;
        memset(ans2,0,sizeof(ans2));
        Min=1e16;Max=-1e16;pos=0;
        memset(prime,0,sizeof(prime));
        memset(notprime,0,sizeof(notprime));
    }
    inline void update(){
        notprime[1]=1;
        for(R int i=2;i<=sqrt(r)+1;++i){
            if(!notprime[i]){
            prime[++num]=i;
            for(R int j=i;j<=(sqrt(r)+1)/i;++j)
            notprime[i*j]=1;
            }
        }
    }
    inline void query(){//判断素数, 求距离    
        if(l==1)
        flag[0]=1;
        for(R int i=1;i<=num;++i){
        //printf("%lld %lld
    ",l/prime[i],r/prime[i]);
        for(R int j=l/prime[i];j<=r/prime[i];j++)
        if(j>=2&&prime[i]*j>=l)
        flag[prime[i]*j-l]=1;
        }
        R ll last=-1;
        for(R ll i=0;i<=r-l;++i){
        if(!flag[i]){
          if(last==-1)
          last=i;
          else
          {
          ans=1;
          if(i-last<Min){
          ans1[1]=last+l;
          ans1[2]=i+l;
          Min=i-last;
          }
            if(i-last>Max){
           ans2[1]=last+l;
             ans2[2]=i+l;
             Max=i-last;
          }
          last=i;
          }
          }
        }
    }
    int main(){
        while(cin>>l>>r){
        init();
        update();
          query();
        if(ans)
        printf("%lld,%lld are closest, %lld,%lld are most distant.
    ",ans1[1],ans1[2],ans2[1],ans2[2]);
        else printf("There are no adjacent primes.
    ");
        }
        return 0;
    }
  • 相关阅读:
    Perl文件处理示例——批量添加Copyright版权信息
    关于Perl文件操作——批量修改文件名
    保持创造力的29种方法
    用perl实现宋词词频统计——东风何处是人间
    Verilog UDP(User Defined Primitives)
    [转]一些经典的计算机书籍
    [转]30分钟,让你成为一个更好的程序员
    Python 使用数据库(SQLite)
    scrapy配置mysql
    创建自己的网站博客Hexo
  • 原文地址:https://www.cnblogs.com/sky-zxz/p/9837707.html
Copyright © 2011-2022 走看看