首页 > 其他分享 >【学习笔记】欧拉线性筛

【学习笔记】欧拉线性筛

时间:2024-09-17 14:02:22浏览次数:1  
标签:prime int 笔记 素数 maxn 线性 欧拉

欧拉线性筛

简介

欧拉线性筛主要用于求\(n\)以内的所有素数,时间复杂度为\(O(n)\)

算法实现

欧拉线性筛的原理是保证\(n\)以内的所有素数只被他所含有的最小质因子筛过,这样就使得每个素数只被筛过了一次。
我们设一个数组\(prime[i]\)表示第\(i\)个素数是多少,\(is\_prime[i]\)表示第\(i\)个数是否为素数。
对于外层循环,我们枚举从1枚举到\(n\),如果当前\(i\)为素数,那么我们就把它加入到\(prime[]\)数组中。
对于当前已经出现过的素数\(prime[j]\),那么它与\(i\)的乘积就一定为合数,所以\(is\_prime[prime[j]*i]=1\)。注意在枚举\(j\)时,\(j\le tot,i*prime[j]\le n\)
欧拉函数的精华

\[if(!i\%prime[j])\ break; \]

这条语句保证了所有数只被它最小的质因子筛到。
对于当前所有\(prime[j]\)筛到的数,都含有一个因数\(i\),上面这条语句一旦执行,就表示\(prime[j]\)就是\(i\)最小的质因子,我们令\(a=prime[j]\),则往后所有的\(prime[j]>a\),所以往后筛到的所有数的最小质因子都是\(a\),不用\(prime[j]\)来筛掉,所以终止循环。

模板代码

#include<bits/stdc++.h>
#define maxn 100000010
using namespace std;
int n,q,tot=0,prime[maxn];
bool isprime[maxn];
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>q;
	memset(isprime,1,sizeof(isprime));
	for(int i=2;i<=n;i++){
		if(isprime[i])prime[++tot]=i;
		for(int j=1;prime[j]*i<=n&&j<=tot;j++){
			isprime[prime[j]*i]=0;
			if(i%prime[j]==0)break; 
		}
	} 
	while(q--){
		int k;
		cin>>k;
		cout<<prime[k]<<endl;
	}
	return 0;
}

标签:prime,int,笔记,素数,maxn,线性,欧拉
From: https://www.cnblogs.com/GSNforces/p/18417131

相关文章

  • 【学习笔记】扩展欧几里得
    扩展欧几里得算法(exgcd)简介扩展欧几里得算法基于辗转相除法构建,主要用于求方程\[ax+by=c\]最小正整数解步骤1.求方程\(ax+by=gcd(a,b)\)的解我们构造两个方程\[\begin{cases}ax+by=gcd(a,b)\\bx'+(a\%b)y'=gcd(b,a\%b)\end{cases}\]因为由欧几里得算法易于得到\[gc......
  • CMake构建学习笔记17-uriparser库的构建和使用
    在连续论述了几篇关于CMake如何使用的文章之后,笔者也是感觉被掏空了。接下来几篇就还是回到构建依赖库的问题上,容笔者花时间找到更好的主题来介绍更多关于CMake使用干货。如何有的读者自信已经很熟悉这方面的知识,可以进行跳过,在需要的时候再进行查阅。uriparser是一个严格遵循RFC......
  • 线性代数(宋浩版)(4)
    2.4逆矩阵(不要把矩阵放在分母上)方阵的行列式性质1性质2性质3伴随矩阵(只有方阵才有)1.求出所有元素的代数余子式(矩阵先求行列式)。2.按行求的代数余子式按列放。定理1(重要)定理2|A|不等于0,|A*|=|A|n-1(以后可以证明无论是否A的行列式等于零,该定理都成立)注:所有方......
  • 2024/9/17 笔记
    多项式以后再写吧。首先庆祝一下把猪国杀A了[SDOI2010]猪国杀题目描述游戏背景《猪国杀》是一种多猪牌类回合制游戏,一共有\(3\)种角色:主猪,忠猪,反猪。每局游戏主猪有且只有\(1\)只,忠猪和反猪可以有多只,每只猪扮演$1$种角色。游戏目的主猪/\(\texttt{MP}\):自己存活......
  • 初学Linux笔记
    对linux系统中目录的解释:/bin:bin是Binary的缩写,这个目录存放着最经常使用的命令。/boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev:dev是Device(设备)的缩写,存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。/e......
  • 【学习笔记】数位DP
    数位DP适用条件此类题目一般要求在\([l,r]\)区间内满足条件的数的个数,答案一般与数的大小无关,而与数各位的组成有关。题目中给出的数的范围一般较大,往往在\(10^9\)以上因此无法暴力枚举,只能使用动态规划代码实现使用记忆化搜索更简单易于理解。从数的高位向低位搜索,每一位可......
  • 数据结构与算法(四)线性表的抽象数据类型描述
    一、回顾    上一篇我们讲到了线性表的定义,讲到了所谓抽象数据类型就是把数据类型和操作捆版在一起。那么我们接下来分析一下,线性表应该有什么样的相关操作呢?。    从一个例子来看一看,回到我们上一篇开学参加升旗仪式的例子:    老师把同学们按照规......
  • C/C++笔记
    C/CPP笔记杂记structmsg_train和typedefstructmsg_train大小不一样cstdio和stdio#include<stdio.h>intmain(){printf("Hello,World!\n");return0;}#include<cstdio>intmain(){std::printf("Hello,World!\n"......
  • 【自学笔记】支持向量机(2)——核函数
    引入  核函数的功能是将一组数据映射到更高维的特征空间,这样可以让在低维无法线性分类的数据能够在高维空间下被分类。  可以证明,如果原始数据是有限的维度,那么一定存在一个高维特征空间使得样本线性可分。  文章内容由《机器学习》相关内容,网络资源,GPT回答和个人......
  • Linux实操笔记2 Ubuntu安装Nginx的不同方法
    今天来了解Ubuntu或者说Linux系统安装Nginx的几种办法。包括从Ubuntu的库安装到官方源码编译安装。一、Nginx是什么?以下是来自Nginx中文文档的内容。Nginx是一个高性能的Web和反向代理服务器,它具有有很多非常优越的特性:作为Web服务器:相比Apache,Nginx使用更少的......