Meisell-Lehmer算法(大素数模板)

1000亿以内的素数统计(Meisell-Lehmer算法) 今年沈阳有个素数计数的题,但是数据到了1e11,大概用Meisell-Lehmer能跑到2、3秒的样子,但是据说还有一种Deleglise Rivat的算法特别快,大概1e16差不多才3、4秒的样子,但是网上没有找到板子,所以就发一个Meisell-Lehmer的模板,1e11内的数差不多都能在5秒内处理完:#include using namespace std; typedef long 阅读详情

比赛的时候搜到了这个模板,居然没细看……看到其他博主有说还有更快的叫Deleglise Rivat的算法,并没有搜到……

努力看明白……

网上搜的模板:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define LL long long
using namespace std; 
const int N=5e6+2;
bool np[N];
int prime[N],pi[N];

int getprime(){
    int cnt=0;
    np[0]=np[1]=true;
    pi[0]=pi[1]=0;
    for(int i=2;i<N;++i){
        if(!np[i]) prime[++cnt]=i;
        pi[i]=cnt;
        for(int j=1;j<=cnt&&i*prime[j]<N;++j){
            np[i*prime[j]]=true;
            if(i%prime[j]==0) break;
        }
    }
    return cnt;
}
const int M=7;
const int PM=2*3*5*7*11*13*17;
int phi[PM+1][M+1],sz[M+1];
void init(){
    getprime();
    sz[0]=1;
    for(int i=0;i<=PM;++i) phi[i][0]=i;
    for(int i=1;i<=M;++i){
        sz[i]=prime[i]*sz[i-1];
        for(int j=1;j<=PM;++j){
            phi[j][i]=phi[j][i-1]-phi[j/prime[i]][i-1];
        }
    }
}
int sqrt2(LL x){
    LL r=(LL)sqrt(x-0.1);
    while(r*r<=x) ++r;
    return int(r-1);
}
int sqrt3(LL x) {
    LL r=(LL)cbrt(x-0.1);
    while(r*r*r<=x) ++r;
    return int(r-1);
}
LL getphi(LL x,int s){
    if(s==0) return x;
    if(s<=M) return phi[x%sz[s]][s]+(x/sz[s])*phi[sz[s]][s];
    if(x<=prime[s]*prime[s]) return pi[x]-s+1;
    if(x<=prime[s]*prime[s]*prime[s]&&x<N){
        int s2x=pi[sqrt2(x)];
        LL ans=pi[x]-(s2x+s-2)*(s2x-s+1)/2;
        for(int i=s+1;i<=s2x;++i){
            ans+=pi[x/prime[i]];
        }
        return ans;
    }
    return getphi(x,s-1)-getphi(x/prime[s],s-1);
}
LL getpi(LL x){
    if(x<N) return pi[x];
    LL ans=getphi(x,pi[sqrt3(x)])+pi[sqrt3(x)]-1;
    for(int i=pi[sqrt3(x)]+1,ed=pi[sqrt2(x)];i<=ed;++i){
        ans-=getpi(x/prime[i])-i+1;
    }
    return ans;
}
LL lehmer_pi(LL x){
    if(x<N) return pi[x];
    int a=(int)lehmer_pi(sqrt2(sqrt2(x)));
    int b=(int)lehmer_pi(sqrt2(x));
    int c=(int)lehmer_pi(sqrt3(x));
    LL sum=getphi(x,a)+LL(b+a-2)*(b-a+1)/2;
    for(int i=a+1;i<=b;i++){
        LL w=x/prime[i];
        sum-=lehmer_pi(w);
        if(i>c) continue;
        LL lim=lehmer_pi(sqrt2(w));
        for(int j=i;j<=lim;j++){
            sum-=lehmer_pi(w/prime[j])-(j-1);
        }
    }
    return sum;
}
int main() {
    init();
    LL n;
    ios::sync_with_stdio(false);
    while(cin>>n){
        cout<<lehmer_pi(n)<<endl;
    }
    return 0;
}


告别谷歌!QGC地面站v4.0.x保姆级教程:用高德/天地图瓦片替换老旧地图源 本文提供QGroundControl(QGC)地面站v4.0.x的详细教程,指导用户如何用高德地图和天地图瓦片替换默认地图源,解决数据陈旧、访问不稳定等问题。教程涵盖环境配置、源码修改、地图集成及性能优化,帮助无人机开发者打造稳定高效的中文地图解决方案。 阅读详情

相关推荐

ArcMap新手必看:5分钟搞定面要素的四至信息提取(附字段重命名技巧)

本文为ArcMap新手提供了快速提取面要素四至信息的详细教程,包括数据准备、坐标系选择、批量处理技巧及字段重命名优化方案。通过实战步骤和Python脚本示例,帮助用户高效完成GIS数据处理任务,特别适合行政区划数据分析和报告生成。

weixin_29266007的博客 384

Meissel-Lehmer 算法

由于 n 区间内的整数个数为 n,而对于任意一个块大小,块的数量为 n/n^{2/3}=n^{1/3},因此需要约为 n^{1/3} 个块才能覆盖这个区间内的所有数。3. 遍历 p 中的每个质数 p_i,从 p_i^2 开始,对于每个块 j,计算 g_{i,j} 表示 [1, n^{2/3}] 范围内 p_i 的倍数在第 j 块中出现的次数,使用前缀和的方法加速计算。其中 s_{i,j} 表示第 j 块内第 i 个质数,g_i,j 表示第 j 块内 [1, n^{2/3}] 范围内 p_i 的倍数的个数。

m0_72572901的博客 1059

强化学习:Distributed PPO (DPPO) 学习笔记

DPPO = Distributed + Proximal Policy Optimization Distributed:多个智能体并行训练 Proximal:限制策略更新幅度,确保稳定性 Policy Optimization:基于策略梯度的优化方法 核心思想:多个智能体并行探索环境,共享经验,通过裁剪策略更新确保训练稳定

只是个人学习笔记 1330

【算法学习笔记】Meissel-Lehmer 算法 (亚线性时间找出素数个数)

「Meissel-Lehmer 算法」是一种能在亚线性时间复杂度内求出 \(1\sim n\) 内质数个数的一种算法。 在看素数相关论文时发现了这个算法,论文链接:Here。 算法的细节来自 OI wiki,转载仅作为学习使用。 目前先 mark 一下这个算法,等有空的时候再来研究一下,算法的时间复杂度为 \(\mathcal{O}(n^{\frac23})\) ,所以 \(n\) 的范围可以...

橘嘉禾 561

【深度解析】信息素养提升实践活动(附:历年获奖作品分析)

全国师生信息素养提升实践活动是由教育部教育技术与资源发展中心(中央电化教育馆)主办,面向全国师生的一项信息化交流展示活动。

m0_74417957的博客 9645

DXF转G代码是圆弧的方向如何确定?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1185

【C】Lehmer‘s GCD algorithm

【代码】【C】Lehmer's GCD algorithm。

amber_o0k的博客 333

【乐企】有关乐企能力测试接口对接-基础版(详细)

乐企能力测试接口对接详细代码以及步骤

九七的博客 7655

探索质数之奥秘:认识primecount,你的高效质数计数工具

探索质数之奥秘:认识primecount,你的高效质数计数工具 在这个数字的世界里,质数,那些只有1和自身两个正因数的神秘数字,一直是数学家探索的热点。如今,我们有了一个强大的工具——primecount,它不仅是一个命令行程序,也是一个功能全面的C/C++库,专为快速准确地计算小于或等于任意给定数x的所有质数数量而设计。 项目介绍 primecount,正如其名,专注于高效执行质数计数任务。它的...

gitblog_00465的博客 637

手把手教你玩转CPU微架构--​第三章:乱序执行的“魔法”——如何让指令“插队”提升效率​​3.4 动手实验:用Gem5模拟器分析乱序执行对IPC的提升(对比顺序执行)

摘要:本章通过Gem5模拟器对比乱序执行(O3CPU)和顺序执行的性能差异,实验采用SPECCPU2017和PARSEC3.0基准测试,配置7级流水线、4指令/周期发射宽度及多级缓存。结果显示,乱序执行平均提升IPC超过100%,关键因素包括动态指令调度、缓存命中率提升(L1达92%)和TAGE分支预测(准确率95%)。优化方向包括增大指令缓存和发射队列深度。实验验证了乱序执行在减少流水线停顿和提升吞吐量方面的显著优势。

MHD0815的博客 165

模型瘦身术:YOLOv5无损剪枝实战教程

本文介绍了一种YOLOv5模型的无损剪枝方法,通过"稀疏训练+结构化剪枝+微调"的流程,在不损失精度的前提下显著减小模型尺寸并提升推理速度。具体步骤包括:1)稀疏训练给参数排优先级;2)裁剪不重要通道;3)微调恢复精度;4)验证效果。实战部分详细展示了从环境搭建到剪枝实现的完整流程,并分析了剪枝后在边缘设备部署、实时检测等场景的优势。该方法可使YOLOv5s模型从14MB缩减至2-3MB,推理速度提升30%-50%,适用于资源受限设备的轻量化部署需求。

LXY_LOVE36的博客 104

Meisell-Lehmer算法(求1...n范围内的素数个数)

求1...n范围内的素数个数有多少了,如果数据不大的话素筛肯定就可以了,但像HDU-5901中n的范围为10^11肯定就不能素筛了,所以这里介绍Meisell-Lehmer算法,代码颇是复杂,摘的网上的模板然后改成自己的代码习惯。 //Meisell-Lehmer算法 #include #include #define LL long long using namespace st

yo_bc的博客 1636

数学建模Matlab算法,第七章 对策论

对策论作为研究竞争与决策的数学理论,从零和对策到非常数和对策,为分析各类博弈问题提供了系统框架。其核心要素包括局中人、策略集和赢得函数,通过稳定解、Nash平衡点等概念揭示竞争规律。该理论广泛应用于经济、军事、政治等领域,不仅提供具体分析工具,更改变了决策思维方式,强调在互动中实现理性选择。对策论既揭示了竞争本质,也凸显合作价值,为解决社会矛盾、促进共赢发展提供了重要启示,在全球化背景下将发挥更大作用。

unber的博客 106

Meisell-Lehmer大素数计数 求第i个素数 + 二分

数据到1e11,用Meisell-Lehmer能跑到2、3秒,但是据说还有一种Deleglise Rivat的算法特别快,大概1e16差不多才3、4秒的样子,但是网上没有找到板子,所以就发一个Meisell-Lehmer的模板,1e11内的数差不多都能在5秒内处理完: #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N = 5e6 + 2; bool np[N]; int pri

。 370

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

HDU 5901 Count primes (大素数模板题)

题意:求1-n有多少个素数,n可以1e11左右 复杂度大概O(n^(3/4)) #include #define ll long long using namespace std; ll f[340000],g[340000],n; void init(){ ll i,j,m; for(m=1;m*m<=n;++m)f[m]=n/m-1;

K键盘里的青春K 668

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

大素数模板

如果不会,沈阳网络赛基本就gg了,但是那个论文题,我其实还是没有读懂,那是个codeforces的f题,但是,,,,,,真的还是没有读懂。。。我看网络上也没有人读懂。还是留着珍藏吧 题意 求区间[1,N]的质数的个数(1≤N≤1e11)第一个哈 复杂度大概O(n^(3/4))#include<iostream> #include<algorithm> #include<cstdio> #de

就是想多赚点币子 409

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

hdu5901 大素数筛

(记个模板 题意: 求1−n中质数个数(n&lt;=1e11)求1-n中质数个数 (n&lt;=1e11)求1−n中质数个数(n<=1e11) 出处 Meisell−Lehmer算法,复杂度n23Meisell-Lehmer算法,复杂度n^{\frac{2}{3}}Meisell−Lehmer算法,复杂度n32​ #include<cstdio> #includ...

WayJasy的博客 294

【HDU5901】Count primes(大素数模板)

纯记录,膜拜大神。 http://blog.youkuaiyun.com/xuanandting/article/details/52577406 //Meisell-Lehmer #include<cstdio> #include<cmath> using namespace std; #define LL long long

No Program No Life 338

hdu 5901 Count primes (大素数模板)

题意:求区间[1,N]的质数的个数(1≤N≤1011)。 Count primes 复杂度大概O(n^(3/4))#include <bits/stdc++.h> #define ll long long using namespace std; ll f[340000],g[340000],n; void init(){ ll i,j,m; for(m=

黑码 775

素数问题——Meisell-Lehmer算法

素数问题——Meisell-Lehmer算法

OPM的博客 3047

梅森素数 判定总结 - Lucas-Lehmer算法 & Miller-rabin算法

梅森素数 定义: if m是一个正整数 and 2^m-1是一个素数 then m是素数 if m是一个正整数 and m是一个素数 then M(m)=2^m-1被称为第m个梅森数 if p是一个素数 and M(p)是一个素数 then M(p)被称为梅森素数 Lucas-Lehmer判定法:判定一个梅森数是否是梅森素数 设p是素数,第p个梅森数为M(p)为2^p-1,r1 = 4,对于k...

weixin_30824277的博客 464

Count primes (Meissel-Lehmer算法)

Easy question! Calculate how many primes between [1…n]! Input Each line contain one integer n(1 <= n <= 1e11).Process to end of file. Output For each case, output the number of primes in interval [

q435201823的博客 2449

HDU 5901 Count primes【数论】

Count primes Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 903    Accepted Submission(s): 481 Problem Description Easy question!

Puya的博客 807

素数计数公式全面拉丁化改写-小有改进-Meissel公式-梅塞尔-Lehmer公式-莱梅=勒梅尔-筛法三种形式-孟庆余公式(转载)...

何冬州的百度空间Blog本文的另一版本:http://hi.baidu.com/wsktuuytyh/blog/item/396a934ac679680208f7ef2c.html信息革命先驱者/数学电脑爱好者 注: wsktuuytyh 即何冬州 三字的五笔编码 主页博客相册|个人档案|好友|个人中心|i贴吧 写新...

weixin_30505225的博客 412

hdu5901

转载自:http://www.cnblogs.com/Ritchie/p/5886186.html HDU 5901 Count primes (1e11内的素数个数) -2016 ICPC沈阳赛区网络赛 题目链接 题意:求[1,n]有多少个素数,1 官方题解:一个模板题, 具体方法参考wiki或者Four Divisors。 题解:给出两种代码。

Everything can be done! 619

【模板】Meisell-Lehmer 模板

求1-n范围内的素数个数: #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N = 5e6 + 2; bool np[N]; int prime[N], pi[N]; int getprime() { int cnt = 0; np[0] = np[1] ...

Summer_via的博客 1205
上一篇: poj 3259 Wormholes(最短路Bellman-Ford算法)
下一篇: poj1094 Sorting it all out(拓扑排序)
Mandsnow
博客等级 码龄11年 8粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值