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

Apache Hop集成Spring Boot实战:从配置到执行HPL文件

本文详细介绍了将Apache Hop集成到Spring Boot应用中的完整实战方案。通过配置核心依赖、初始化Hop环境、编写服务层逻辑,实现了在Java应用中程序化执行HPL管道文件,从而将可视化ETL能力无缝嵌入微服务架构,提升数据处理的自动化与可维护性。

blue42的博客 476

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

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

m0_62937331的博客 1299

【SWAT水文模型】SWAT-CUP参数率定与模型验证实战指南

本文提供了SWAT水文模型参数率定与模型验证的完整实战指南。详细介绍了如何使用SWAT-CUP工具,特别是SUFI-2算法,进行自动化参数校准,并阐述了模型验证的关键步骤以避免过度拟合。内容涵盖从工程搭建、核心参数选择、迭代优化到结果分析与常见问题排查的全流程,旨在帮助用户提升SWAT模型模拟的准确性与可靠性。

weixin_29072299的博客 499

python课程教学大纲-《Python语言基础》课程教学大纲

《Python语言基础》课程教学大纲课程名称:Python语言基础课程类别:专业选修课适用专业:电子信息工程考核方式:考查总学时、学分:32学时1.5学分其中讲授16学时,实验10学时,其他6学时一、课程性质、教学目标使学生在全面了解Python技术历史、现状与发展趋势的基础上,系统掌握Python基本概念、编程思想以及程序设计技术,具备熟练的Python编程技能和面向对象软件设计技术思想,完成本...

weixin_37988176的博客 3720

欧拉筛(线性筛)模板

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

chen0708chen的博客 355

Windows系统下复现PointNet++算法

本文详细介绍了如何在Windows系统下复现PointNet++算法,内容包括程序下载、环境配置、数据集准备以及三个主要任务(语义分割、分类、部件分割)的实现步骤和常见报错解决方法。通过遵循本文的指导,用户可以顺利完成PointNet++算法的复现。

LingYi_5的博客 4326

线性筛模板

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

weixin_45925735的博客 249

TC3xx芯片SPI多从机通信避坑指南:AUTOSAR框架下的DMA配置与片选切换

本文针对英飞凌TC3xx芯片在AUTOSAR框架下实现SPI多从机通信的实战难题,提供了详尽的避坑指南。重点解析了如何利用硬件支持的16路片选(SLSO)灵活切换,在AUTOSAR中正确配置不同时序的从设备,并深入探讨了异步模式下DMA的启用条件与关键配置细节,帮助开发者规避通信失败风险,提升系统可靠性。

nn3456的博客 153

29、5G PUCCH格式及资源配置详解

本文详细解析了5G通信系统中的物理上行控制信道(PUCCH)的不同格式及其资源配置方案。PUCCH负责传输上行控制信息(UCI),包括混合自动重传请求(HARQ)确认信息、调度请求(SR)和信道状态信息(CSI)等。文章从PUCCH的基本概念出发,深入分析了格式0到格式4的特点、编码调制方式、干扰随机化机制以及适用场景,并探讨了PUCCH资源集的配置方法和上行控制信令在PUSCH上的传输机制。通过对比不同格式的传输能力、干扰随机化方式和频率跳变能力,为读者提供了选择合适PUCCH格式的决策依据。最后,文章总

oil88的博客 252

P3383 【模板】线性筛素数

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

ra90fy的博客 195

nvidia系列教程-AGX-Orin基础环境搭建

NVIDIA Jetson AGX Orin 是一款功能强大的嵌入式AI平台,专为需要高性能和低功耗的边缘计算应用设计。无论是自动驾驶、机器人,还是智能监控系统,Jetson AGX Orin 都能为这些应用提供强大的计算能力。本篇博客将为大家详细介绍如何在AGX Orin(32GB)上搭建基础开发环境,包括系统安装、CUDA和cuDNN的配置等,帮助你快速上手这个强大的平台。架构: 搭载 56 个 Tensor Core 的 1792 核 NVIDIA Ampere c GPUCUDA Cores。

flypig has a dream! 2796

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

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

2302_79431881的博客 730

利用 Python 构建高效爬虫爬取国家标准文献——从基础到进阶

然而,由于许多标准文献需要从特定网站获取,手动下载既耗时又低效,因此构建自动化爬虫成为一种实用且高效的解决方案。本文从技术选型、网站分析、代码实现到反爬优化,全面讲解了如何爬取国家标准文献。国家标准文献(National Standards Literature)是国家对各领域统一规范的文件,涵盖了技术参数、测试方法、生产工艺等内容。因此,通过自动化爬虫技术进行文献爬取和管理,不仅能解放劳动力,还可以提高数据管理效率。在构建爬虫前,我们需要对目标网站进行分析,包括页面结构、请求方式以及可能的反爬机制。

2201_76125261的博客 2104

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

yaosichengalpha的博客 1227

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

Ω 1295

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

余额充值