线性筛(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

展会客流统计的客流统计系统,WiFi客流每时每客

一般展会的举行时间都在3-7天之间,展会作为市场部门一项重要工作,一直以来没有一项有效的工具能够提供数据支持。 展会最重要的是通过活动和产品来吸引参展者的参观,如何统计展会期间的客流量呢?如何通过将数据转化成为活动数据的支撑呢? 目前成熟的解决方案有,视频客流统计、WiFi客流统计、红外线客流统计等方式。由于展会通常的时间都比较短,视频、红外线客流统计采购及安装价格都比较高,需

isentech的博客 3994

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

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

m0_62937331的博客 1299

MIPI video mode 和 command mode 的区别

1、何为LCD RAM? LCD 是指字面意思是液晶显示屏(Liquid Crystal Display), 而RAM: 随机存取存储器(Random-Access Memory),两者完全是风马牛不相及的东西。 下图是一个标准的LCD的爆炸图(不含TP),请注意图中红色mark的地方:控制IC-- LCD的大脑。所谓的LCD RAM自然是指此大脑是否包含RAM. 题外话<不感兴趣的...

精诚所至 4690

亚马逊(Amazon ads)广告API申请步骤(已经更新完)

你如果是自己的店铺使用,就选择左边的、如果是授权的那种给别人用就选右边的。审核通过了才能进行下一步,我目前就是刚申请完,后续会持续更新!然后会调整到,下面的页面,选择Agency然后右上角点击创建。审核通过会发邮件到你的企业邮箱、时间大概是1-7天左右。输入对应的信息,点击提交审核,就可以开始申请了。1、广告平台跟卖家平台是分开的,这个概念要清楚。2、注册广告一定要用企业邮箱!回到首页,点击成为合作伙伴。注册了以后会跳转到广告。然后再点击加入合作伙伴。然后会弹出下面的页面。

阿泽的博客 5655

欧拉筛(线性筛)模板

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

chen0708chen的博客 355

YOLOv5轻量化实战:从Ghost模块到工业级部署的完整指南

本文详细介绍了YOLOv5轻量化实战,重点解析了Ghost模块在工业检测中的应用及其优化策略。通过Ghost卷积技术,模型参数量和GFLOPs显著降低,同时保持高精度,适用于实时性要求严格的工业场景。文章还提供了从模型优化到TensorRT加速的完整部署指南,助力开发者实现高效工业级应用。

weixin_28223453的博客 489

线性筛模板

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

weixin_45925735的博客 249

STM32F103C8T6+HX711实战:从零打造智能体重秤(附OLED显示与语音播报)

本文详细介绍了基于STM32F103C8T6微控制器和HX711称重模块,从零构建智能体重秤的完整实战教程。内容涵盖硬件选型、系统架构、驱动编写、数据滤波校准算法,并实现了OLED显示与语音播报功能。该项目是嵌入式学习的综合性实践,尤其适合作为毕业设计课题,帮助开发者掌握传感器应用、数据处理及人机交互等核心技能。

weixin_28285943的博客 517

2024高教社杯数学建模国赛B题丨国一原创论文解析及源码超详细分享!

继续分享一篇2024国赛B题的国奖论文,包含可运行源代码jupyter,国赛B题通常比较聚焦实际复杂系统的多目标优化决策,主要偏重算法实现与概率建模解决开放性的管理问题。而且高度开放,无标准答案,学科交叉复杂,如资源调度、交通优化、海洋探测等。比较建议有一定统计学基础的同学参加。

ihui永不放弃 6738

P3383 【模板】线性筛素数

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

ra90fy的博客 195

从零到精通:BLDC电机驱动电路详解与设计思路

这套电机驱动电路从核心控制器到反馈采集模块,涉及了BLDC电机驱动的方方面面。每一个模块的设计和选择都需要综合考虑系统需求和实际使用环境。在实际应用中,很多细微的设计改进都会显著影响电机的运行性能。

weixin_43199439的博客 3100

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

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

2302_79431881的博客 730

算法真的是个很有用的东西,通过python或者golang实现对N张图片的自动排版,每张图片的长和宽都不一样,有的是横图,有的是竖图,最终需要生成一张完整的矩形图片

算法真的是个很有用的东西,通过python或者golang实现对N张图片的自动排版,每张图片的长和宽都不一样,有的是横图,有的是竖图,最终需要生成一张完整的矩形图片。

代码讲故事 503

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

yaosichengalpha的博客 1227

Statistics and Machine Learning Toolbox

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

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

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

Ω 1295

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

洛谷: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、付费专栏及课程。

余额充值