线性筛(P3383 【模板】线性筛素数)

线性筛法(欧拉筛) C++ 模板 4. st[N] st[i]为0表示这个数字没被筛过 1表示这个数字被筛过。第二个循环语句处理primes数组中存放的素数 取其与i的倍数。在处理数据量大的时候速度快,可以比埃氏筛快很多倍。不断找到一个素数,然后将其在范围内的所有倍数筛去。2. primes[N] 这个数组用来存放素数。5. minp[N] 保存一个数的最小质因子。最近学习了求素数的线性筛法,和大家分享一下。1.求 1 - N 的所有素数。1. N 决定求素数的范围。准备好以上这些后就可以发车啦! 阅读详情
Description

线性筛(欧拉筛)模板题

Solution

由于原题的素数筛取规模达到了10810^8108,故我们需要O(n)O(n)O(n)做法。

考虑埃氏筛的做法:虽然经过优化的埃氏筛复杂度达到了O(nloglogn)O(nloglogn)O(nloglogn),但还是存在合数被它的多个因子标记为合数。而线性筛的优点则在于每一个合数只会被筛一次且保证被筛掉。这样一来整个筛法的复杂度就可以降低到O(n)O(n)O(n)。

首先我们看筛法的代码:

	memset(isprime,true,sizeof(isprime));
	isprime[1]=false;
	for(ri i=2;i<=n;++i)
	{
		if(isprime[i])	prime[++cnt]=i;
		for(ri j=1;j<=cnt&&i*prime[j]<=n;++j)
		{
			isprime[i*prime[j]]=false;
			if(i%prime[j]==0)	break;
		}
	}

为了保证每一个数只会被其最小的因子筛掉,循环最外层iii枚举每一个≤n\le n≤n的数的除其本身外的最大因子(不是最大质因子)。然后,如果当前iii未被标记过,说明其为素数;之后,我们枚举当前筛出的所有素数(注意:当前筛出的素数显然小于等于iii)从而枚举满足如下条件的数:以当前iii为最大因子(除本身外)且保证primejprime_jprimej​为最小因子的数。

接下来,我们解释一下第二层循环里的两个语句:

第一句:isprime[i∗prime[j]]=falseisprime[i*prime[j]]=falseisprime[i∗prime[j]]=false:由于比prime[j]prime[j]prime[j]小的所有素数都不是iii的因子(否则第二条语句会break),故prime[j]prime[j]prime[j]一定是i∗prime[j]i*prime[j]i∗prime[j]的最小质因子。筛掉;

第二句:如果发现当前prime[j]prime[j]prime[j]为iii的因子,由于循环枚举到了prime[j]prime[j]prime[j],故prime[j]prime[j]prime[j]一定是iii的最小质因子,那么如果再继续枚举当前筛出的素数,i∗prime[j+k](k>0)i*prime[j+k](k>0)i∗prime[j+k](k>0)的最小质因子为prime[j]prime[j]prime[j],不满足一个数只被筛一遍,故break。

最后,我们说明两点:在执行线性筛的过程中:

1、每一个合数一定会被筛掉:根据以上对内层循环体的解释,易证每一个合数都会被筛到(将任意合数分解为其最小质因子与最大非本身因子之积,最外层枚举到其最大非本身因子时该数会被筛掉且中途显然不会break)。

2、每一个数只被其最小质因子筛一遍:假设当前有一个数prime[i]∗prime[j]∗k(i<j)prime[i]*prime[j]*k(i<j)prime[i]∗prime[j]∗k(i<j),现在我们考虑它会不会通过prime[j]prime[j]prime[j]被筛掉:

如果其被prime[j]prime[j]prime[j]筛掉,那么其最大因子i=prime[i]∗ki=prime[i]*ki=prime[i]∗k,但由于prime[i]∗kprime[i]*kprime[i]∗k会在枚举到prime[i](prime[i]<prime[j])prime[i](prime[i]<prime[j])prime[i](prime[i]<prime[j])的时候被判断prime[i]∗kprime[i]*k%prime[i]==0prime[i]∗k从而导致循环break,故每一个数不会被除了其最小质因子之外的其它质因子筛掉。

由上述论述可得:线性筛的复杂度为O(n)O(n)O(n)。

Code
#include<cstdio>
#include<cstring>
#include<iostream>
#define ri register int
using namespace std;

const int MAXN=1e8;
int n,q,k,prime[MAXN>>4],cnt;
bool isprime[MAXN+20];

void Eula()
{
	memset(isprime,true,sizeof(isprime));//根据实际需要去掉该句并翻转isPrime的含义 
	isprime[1]=false;
	for(ri i=2;i<=n;++i)//枚举每部分合数的非本身最大因子 
	{
		if(isprime[i])	prime[++cnt]=i;//未被标记即为质数 
		for(ri j=1;j<=cnt&&i*prime[j]<=n;++j)
		{
			isprime[i*prime[j]]=false;//标记合数 
			if(i%prime[j]==0)	break;
			//若继续枚举,接下来枚举到的数的最小因子为prime[j],不合法 
		}
	}
}

int main()
{
	scanf("%d%d",&n,&q);
	Eula();
	for(ri i=1;i<=q;++i)
	{
		scanf("%d",&k);
		cout<<prime[k]<<'\n';
	}
	return 0;
}
【代码超详解】洛谷 P3383 【模板】线性筛素数(埃氏筛法打表 · 已优化) 一、题目描述 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入格式 第一行包含两个正整数N、M,分别表示查询的范围和查询的个数。 接下来M行每行包含一个不小于1且不大于N的整数,即询问该数是否为质数。 输出格式 输出包含M行,每行为Yes或No,即依次为每一个询问的结果。 输入输出样例 输入 #1 100 5 2 3 4 91 97 输出 ... 阅读详情

相关推荐

《P3383 【模板】线性筛素数》

对于 100% 的数据,n=108,1≤q≤106,保证查询的素数不大于 n。如题,给定一个范围 n,有 q 个询问,每次输出第 k 小的素数。第一行包含两个正整数 n,q,分别表示查询的范围和查询的个数。接下来 q 行每行一个正整数 k,表示查询第 k 小的素数。本题已更新,从判断素数改为了查询第 k 小的素数。// 将质数存入 primes 数组。// 标记数组,用于标记每个数是否为质数。// 输出第 m 个质数。// 使用埃拉托斯特尼筛法筛选质数。// 初始化所有数为质数。// 存储质数的数组。

Jasmine_llq的博客 505

[数论+模板] 三大质数筛法(线性筛+素数问题+模板)

文章目录1. 朴素埃筛+模板2. 埃筛+模板3. 线性筛+模板 1. 朴素埃筛+模板 868. 筛质数 可参考:[数论基础] 1. 输出素数(素数筛、线性筛、Miller-Rabbin 素性测试、巧妙解法) 思路: 从 2 到 nnn 将每一个数的所有倍数全部筛掉。这样筛过之后剩余的所有数都是质数。因为对于任意一个数 ppp,如果它没被筛掉,那么意味着从 2 到 p−1p-1p−1 都没有它的因数,则为质数。 时间复杂度分析:n2+n3+⋯nn=n(12+13+⋯1n)\frac n 2 + {\fra

Y-puyu 的博客 2208

从零搭建ECG心电图仪:模拟前端电路设计与噪声对抗实战

在电子工程和生物医学信号处理领域,微弱信号的采集与放大是核心挑战。其基本原理在于利用高精度模拟电路,从强大的环境噪声中提取出有用的差分信号。这项技术的核心价值在于将理论上的传感器信号转化为稳定、可靠的可用数据,是连接物理世界与数字系统的关键桥梁。在医疗监护、工业传感和科学测量等场景中,高性能的模拟前端设计直接决定了整个系统的精度与可靠性。本文聚焦于生物电信号采集这一具体应用,深入探讨如何运用差分放大器、低通滤波器和陷波滤波器等经典模块,构建一个能够有效对抗工频干扰和接触噪声的实用电路,最终实现从人体体表清晰

weixin_30616969的博客 459

线性筛素数模板——(欧拉筛)

学个新知识还是拿博客记录一下吧,方便以后再次遇到(思路和图片来源:洛谷学委,Eon_Floating,Lylighter_ P3383线性筛素数 图片转自洛谷网 if(i % Prime[j] == 0) break; 说说这步理由: 、、、 规则:个合数只会被它的最大非自身因数(对应最小质因数)筛。这样能保证每个合数只会被筛一次。 、、、i的最小质因数是Prime[j],如果j继续递增,会导致被多次筛。 、、、但是由于保证了筛去的合数日后将不会再被筛(总共只筛一次),复杂度是线性的。 /.

m0_62937331的博客 1299

AI量化交易工作台Vibe-Trading:用自然语言驱动策略回测与多智能体研究

量化交易通过数学模型和计算机程序执行投资决策,其核心在于将市场规律转化为可验证的策略。传统量化开发涉及数据获取、策略编写、回测验证等复杂工程,对非编程背景的从业者构成较高门槛。随着大语言模型技术的发展,自然语言交互正成为降低技术使用难度的关键。Vibe-Trading项目正是这一趋势的实践,它将金融工程任务封装为可调用的工具与技能,允许用户通过自然语言指令直接驱动策略回测、因子研究和投资组合分析。其技术价值在于构建了一个模块化的AI Agent框架,通过ReAct推理框架协调多个专项技能,并创新性地引入多智

weixin_28695161的博客 1566

设备管理器找不到蓝牙?从驱动到BIOS的系统排查指南

在Windows系统中,蓝牙功能依赖硬件、驱动、系统服务三层协同工作。设备管理器作为硬件状态的可视化窗口,当蓝牙设备消失时,往往意味着某一层链路中断。常见原因包括BIOS无线开关关闭、驱动异常、蓝牙支持服务被禁用,或系统文件损坏。排查思路应从基础概念出发,先理解蓝牙设备在设备管理器中的四种隐藏位置,再通过扫描硬件、检查BIOS、重装驱动、修复服务等步骤逐层定位。这一方法不仅适用于Windows电脑,也适用于HC-05、ESP32等嵌入式蓝牙模块,因为硬件、协议栈、应用层的故障逻辑相通。掌握这套技术价值在于减

weixin_33377602的博客 267

欧拉筛(线性筛)模板

【代码】欧拉筛(线性筛)模板。

chen0708chen的博客 355

【BAAS】基于supabase的知识库详细设计

为满足快速开发需要和减少开发及维护成本,使用BAAS(Backend-as-a-Service)模式可以很好的降低我们的后端维护成本,并提高前端对接效率。一般来说,BAAS是一种云服务模式,BaaS供应商会为提供一些通用的能力,例如用户身份验证、数据库管理、远程更新和推送通知(针对移动应用程序),以及云存储和自托管。BaaS最主流的是Google的firebase,具有相当完善的功能和集成方案,但他是收费的,而且在我们实际项目中,可能需要私有化部署,这时就需要一些开源的替代方案,例如主流的。

Ric的博客 1781

线性筛模板

思路:用每个合数的最小质因数将其筛出,每个合数的最小质因数只有一个,所以只用筛一次,复杂度为o(n)。 代码: #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<vector> #include<map> using namespace

weixin_45925735的博客 249

机器学习与深度学习基础概念

本篇主要介绍机器学习主要概念,包括不限于标签、特征、样本、训练、模型、回归模型、分类模型、泛化、过拟合、预测、平稳性、训练集、验证集、测试集。

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 3万+

2026年广东省职业院校技能大赛中职组“大数据应用与服务”样题一完整参考答案

2026年广东省职业院校技能大赛中职组“大数据应用与服务”样题一完整参考答案

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 743

P3383 【模板】线性筛素数

【代码】P3383【模板】线性筛素数。

ra90fy的博客 195

Windows安装 OpenClaw详细教程(使用wsl2+ubuntu)

OpenClaw 是一款于 2026年1月 正式对外开源的个人AI助手平台(AI Agent),由 PSPDFKit 创始人彼得·斯坦伯格(Peter Steinberger) 开发。它不仅仅是一个聊天机器人,更是一个能够主动执行任务的“数字管家”。OpenClaw的核心特点是本地化部署、隐私可控以及强大的自动化执行能力。OpenClaw 项目在开发过程中经历过两次更名,最终定为现名:初名:Clawdbot(因与 Claude 名称过于相似引发侵权争议而改名)。

猿小白的博客 1006

洛谷P3383 【模板】线性筛素数

题是模板题,用到了线性筛法,其中原理是保证范围内的每个合数都被删掉(在       bool 数组里面标记为非素数),而且任一合数只被:“最小质因数 × 最大因数(非自己) = 这个      合数”

2302_79431881的博客 730

【深度学习新浪潮】近三年垂域大模型研究与产品进展全景洞察(2022-2025)

近三年来,垂域大模型完成了从技术探索到产业落地的关键跨越,在多个行业实现效率提升与价值创造。面对数据治理、技术适配、生态建设等挑战,未来需要通过技术创新、标准制定、人才培养等多维度发力,推动垂域大模型向更高效、更可靠、更普惠的方向发展。随着"人工智能+"行动的深入推进,垂域大模型将成为数字经济与实体经济深度融合的核心驱动力,为产业智能化升级注入持续动能。

专注:太空算力、AI infra、异构调度、大模型成本工程 786

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

P3383 【模板】线性筛素数 题解

P3383 【模板】线性筛素数 题解

yaosichengalpha的博客 1227

计算机控制技术及应用

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

【C++ 真题】P3383 【模板】线性筛素数

本题要求在线性时间内筛选出给定范围内的所有素数,并支持快速查询第 $k$ 小的素数。题目输入包括查询范围 $n$ 和查询次数 $q$,每次查询输出第 $k$ 小的素数。数据范围较大,$n$ 可达 $10^8$,$q$ 可达 $10^6$,因此需要高效的算法。 题解使用了线性筛法(欧拉筛)来预处理所有素数,时间复杂度为 $O(n)$。通过标记合数的方式,确保每个合数只被其最小质因数标记一次,从而避免重复计算。预处理后,查询第 $k$ 小的素数只需直接输出预先存储的素数数组中的对应元素,时间复杂度为 $O(1)

Ω 1295

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

洛谷:P3383 【模板】线性筛素数

线性筛素数模板

qq_74924951的博客 1224

【洛谷】P3383 线性筛素数(模板)

线性筛素数

Yudiannann的博客 300

C++ P3383 【模板】线性筛素数

题目:https://www.luogu.org/problem/show?pid=3383#sub 哎,个人觉得看别人代码总是好的(我也是看书的),人外有人,天外有天嘛! # include using namespace std; int n, w, ans[1000010], tot, s; // 1…n 的数中 tot 个素数从小到大放在 ans 数组里(多清楚-_-||) bool

ice_word的博客 1375

【模板】线性筛素数(洛谷P3383)

算法选择:数据量>10^7时,必须使用欧拉筛(线性筛),时间复杂度O(N)。内存敏感:数据量达到10^8时,int数组的内存消耗巨大。将标记数组改为bool或bitset。根据素数定理估算素数个数,不要盲目将prime数组开得和N一样大。IO 优化:使用cin.tie(0)和\n替代endl,在大规模查询下能显著提升速度。

布心老混子 所有代码均老混子本人远古手搓 易错点均为学生真实场景 博客文章部分借助ai生成 748
上一篇: P1072 [NOIP2009 提高组] Hankson 的趣味题
下一篇: P2158 [SDOI2008]仪仗队&&欧拉函数的求法
guapi2333
博客等级 码龄9年 7粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值