Prime Distance POJ - 2689(素数筛的应用)

本文介绍了一种高效的素数筛选算法,适用于处理大范围内的素数查询问题。通过预处理一定范围内的质因数,结合合数的性质,能够在较大区间内快速找出所有素数,并计算最接近及最远的相邻素数对。算法复杂度适中,适用于竞赛及实际问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:传送门
题解: L , R ≤ 2 31 L,R\le2^{31} L,R231,素数筛根本打不到 1 e 9 1e9 1e9的范围,但是区间最多只有 1 e 6 1e6 1e6,有一个定理需要知道就是任何一个合数必定包含一个不超过 n \sqrt {n} n 的质因子。可以打出 50000 50000 50000的质因数,然后枚举质数的倍数将 [ l , r ] [l,r] [l,r]区间中的合数筛去,最后从质数中找出答案即可。
复杂度分析:线性筛 O ( 50000 ) O(50000) O(50000),每个倍数大约是 O ( 1 e 6 / p ) O(1e6/p) O(1e6/p),也就是 1 e 6 ∗ 调 和 级 数 1e6*调和级数 1e6的大小,最后大约 1 e 7 1e7 1e7的复杂度可以过题。
c o d e : code: code:

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=1e6,M=5e4+5;
int primes[M],cnt;
bool st[M];
bool flag[N];
ll su[N];
void get_primes(int n)
{
    for(int i=2;i<n;i++){
        if(!st[i])primes[cnt++]=i;
        for(int j=0;j<cnt&&primes[j]*i<=n;j++){
            st[primes[j]*i]=true;
            if(i%primes[j]==0)break;
        }
    }
}
int main()
{
    get_primes(50000);
    ll l,r;
    while(cin>>l>>r){
        memset(flag,false,sizeof(flag));
        for(int i=0;i<cnt;i++){
            int p=primes[i];
            for(ll j=max((l+p-1)/p*p,2ll*p);j<=r;j+=p){
                flag[j-l]=true;
            }
        }
        int tot=0;
        for(int i=0;i<=r-l;i++){
            if(!flag[i]&&i+l>1ll){
                su[tot++]=i+l;
            }
        }
        if(tot<2)puts("There are no adjacent primes.");
        else{
            int minp=0,maxp=0;
            for(int i=0;i+1<tot;i++){
                int d=su[i+1]-su[i];
                if(d<su[minp+1]-su[minp])minp=i;
                if(d>su[maxp+1]-su[maxp])maxp=i;
            }
            printf("%lld,%lld are closest, %lld,%lld are most distant.\n", su[minp], su[minp + 1], su[maxp], su[maxp + 1]);

        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值