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

LabVIEW波形图表时间轴设置:三种方法实现横坐标显示日期时间

在数据采集与设备监控场景中,波形图表的横坐标默认显示采样点序号而非日期时间,这给工程师分析历史数据带来不便。理解时间标识(Timestamp)的本质——一个自1904年起算的双精度秒数,是解决问题的关键。时间轴设置既是显示格式问题,更是数据层与显示层的协同设计。通过属性节点动态生成刻度标签、将时间标识数组直接作为X轴数据、或使用波形数据(Waveform)类型绑定t0与dt,分别适用于固定点数显示、非等间隔事件记录和等间隔连续采样等不同需求。合理选择方案并注意缓冲区预分配与时间连续性处理,可让波形图表准确呈

weixin_33416697的博客 253

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

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

m0_62937331的博客 1299

PCIe扫盲(三)

需要特别注意的是,PCIe的Spec中明确规定只有Root有权限发起配置请求(Originate Configuration Requests),也就是说PCIe系统里面的其他设备是不允许去配置其他设备的配置空间的,即peer-to-peer的配置请求是不允许的。当配置请求进行BDF路由的时候,正是依靠这些信息来确定要找的设备的。前面的文章还介绍过,Root和Switch的每一个端口中都包含一个P2P桥,并且知道桥的配置空间头(Configuration Space Header)是Type1型的。

Liuqz2009的专栏 2402

基于Python批量获取过去某地某时的天气数据

此段代码为经Visual Weather API官网样例后修改。原代码返回数据格式为json,经测试json风速字段不可用,后改为返回数据格式为csv。若修改weather_api_endpoint,还可获取该地点的预测数据,但返回数据字段可能发生变化,请以官网文档为准。获取到的字段包括:平均温度、露点、湿度、风速、降雨量、能见度、云量、天气类型等。目的:已知某一地址,获取过去某一时间该地的天气数据,并能够批量运行。这一步也会有获取不到的时间和地点,因此为空白。此段代码为经百度地图api官网样例后修改。

wiseman1233的博客 905

欧拉筛(线性筛)模板

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

chen0708chen的博客 355

图像去雨:超详细手把手写 pytorch 实现代码(带注释)

占个坑,过几天来写

书山有路,学海无涯! 1万+

线性筛模板

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

weixin_45925735的博客 249

不懂就学之挑战成为WorldQuant Brain顾问的第1天

WorldQuant Brain 是由 WorldQuant 公司开发的一个基于人工智能和机器学习的量化研究平台,旨在帮助量化研究员发现和构建有效的投资策略。WorldQuant 是一家全球领先的量化投资公司,专注于利用数据科学、技术和金融工程开发量化交易策略。

Yanbang1的博客 8385

智能 Agent 跨模态决策机制实战:多源数据融合与感知驱动行为策略设计

随着智能 Agent 应用从结构化文本处理拓展至图像识别、语音交互、传感器响应等多模态环境,其决策机制也面临从单模态语言理解向“多源感知驱动行为选择”的系统跃迁。本文聚焦跨模态输入下的 Agent 决策体系,系统性解析多源数据建模、感知融合方式、模态对齐机制、输入权重控制策略与策略引擎适配路径,进一步结合多模态提示构建、模态感知异常检测、模态优先级路由调度等工程问题进行实战拆解。通过企业级智能客服、制造车间控制、智慧医疗助手等典型案例,本文提供面向真实场景的跨模态 Agent 架构与多输入决策融合方案。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1353

P3383 【模板】线性筛素数

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

ra90fy的博客 195

SQL面试题——抖音SQL面试题 股票波峰波谷

这个题目的难度比较低,我们是用lead 和 lag 两个函数就可以搞定,也就是在一个SQL 里面同时使用多个函数,问题的考查点在于对边界的考虑。

2万+

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

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

2302_79431881的博客 730

液态神经网络(Liquid Neural Networks)从线虫大脑到下一代 AI

液态神经网络(Liquid Neural Networks,LNN)是一类具有动态内部结构的神经网络,其灵感来源于生物神经系统,尤其是大脑中神经元如何以复杂、非线性的方式响应外部刺激。与传统神经网络不同,液态神经网络的每个神经元在处理输入时,不再是静态线性或非线性变换,而是基于一个微分方程模型进行响应。这种建模方式使神经元的行为具有时间连续性和动态适应性。换句话说,它不仅“记住”过去的信息,还能根据当前环境实时调整自身的动态特性,这对于感知、决策、预测等任务都非常关键。

hello.reader 7410

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

yaosichengalpha的博客 1227

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

Ω 1295

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

余额充值