区间筛法 (埃氏筛变种)

本文介绍了区间筛法,一种基于埃氏筛的优化算法。通过筛选小于等于根号b的素数,高效地排除a到b区间内的合数。虽然初看可能引发超时,但通过分析其时间复杂度——小于欧拉常数乘以(b-a),证明了该算法在实际应用中的可行性。
摘要由CSDN通过智能技术生成

最近看到白书上的区间筛法 就根据区间筛自己打了一段代码 理解了一下里面的原理

这个题目我最初一眼看过去就是一次筛法 但是根本不可行啊 时间空间肯定会爆炸 书上介绍说可以用小于等于根下b的素数来筛 刚开始我觉得会超时

但是后来分析了一下这个算法其实还是蛮高效的

1.首先我们要明白一点 : a-b这个区间里边的数之可能被小于等于根下b的素数筛掉 

那么我们可以一边找根下b的素数 一边把他们的倍数从a-b里面删除

2.那么我们最坏情况下要执行根下b-2的次数的大循环 每次小循环 我们估计实现的次数为 (b-a)/i 那么从 2 - max(素数) 累加求和 那么最后会得到一个小于欧拉常数*(b-a)的值 我们就可以知道这个算法是可行的!

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int maxn =1e6+5;
bool isprime[maxn];
bool lowisprime[maxn];
void segment_sieve(long long a,long long b)
{
    for(int i=0;i<1e6+5;i++) isprime[i]=lowisprime[i]=true;
    for(int i=2;(long long )i*i<b;i++)
    {
        if(lowisprime[i])
        {
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值