zoukankan      html  css  js  c++  java
  • POJ 2689

    题意:求[l, r]区间中的间隔距离最大与最小的相邻两个素数,r<2200000000, r-l<10^6

    题解:

      对于<a的合数,其必然存在一个素因子b<=sqrt(a)。

      因此先预处理出所有sqrt(MAXINT)的素数,之后对[l, r]区间进行筛法求素数即可

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #define LL long long
    #define MAXN 2200000000
    
    LL l, r, all;
    bool pd[1000005];
    LL num[10005];
    
    int main()
    {
        pd[1]=1;
        for(LL i=1; i*i < MAXN; i++)
            if(!pd[i])
            {
                num[all++]=i;
                for(LL j=i+i; j*j < MAXN; j+=i)
                    pd[j]=1;
            }
        while(scanf("%lld%lld", &l, &r) != EOF)
        {
            memset(pd, 0, sizeof(pd));
            for(LL i=0; i < all && num[i]*num[i] <= r; i++)
                for(LL j=(((l+num[i]-1)/num[i]>1)?(l+num[i]-1)/num[i]:2)*num[i]; j <= r; j+=num[i])
                    pd[j-l]=1;
            LL close1=0, close2=MAXN, dis1=0, dis2=-1, last=0;
            for(LL i=l; i <= r; i++)
                if(!pd[i-l] && i != 1)//1
                {
                    if(i-last < close2-close1 && last != 0)
                        close2=i, close1=last;
                    if(i-last > dis2-dis1 && last != 0)
                        dis2=i, dis1=last;
                    last=i;
                }
            if(close1 == 0)
                printf("There are no adjacent primes.
    ");
            else
                printf("%lld,%lld are closest, %lld,%lld are most distant.
    ", close1, close2, dis1, dis2);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    转载-如何高效的学习技术
    Lc176-第二高的薪水
    Lc4-寻找两个有序数组的中位数
    Lc175-组合两个表
    Lc3-无重复字符的最长子串
    Lc2-俩数相加
    Lc1- 两数之和
    jpa-子查詢
    20191225页面样式
    leetcode二刷结束
  • 原文地址:https://www.cnblogs.com/Mathics/p/4028682.html
Copyright © 2011-2022 走看看