首页 > 其他分享 >埃氏筛 & 欧拉筛

埃氏筛 & 欧拉筛

时间:2023-05-24 18:47:04浏览次数:47  
标签:埃氏 数列 int ju 质数 合数 欧拉

Part1 埃氏筛

埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。

---百度词条

思想

从一数列中最小质数开始,寻找其倍数,即合数,筛去

直至最后一个质数,此时余下的即数列中所有质数

时间复杂度为 $ O$ ( $ n$ $ log$ $ log$ $ n$ )

图示

埃氏筛

Code

#include <bits/stdc++.h>

using namespace std;

int n, G = 0;
int prime[1005];
bool ju[1005];

int main() {
	scanf("%d", &n);
	for (int i = 2; i <= n; i++) {
		if (!ju[i]) {
			G++;
			for (int j = 2; j <= n / i; j++)
				ju[i * j] = 1;
			printf("%d\n", i);
		}
	}
	return 0;
}

Part2 欧拉筛 / 线性筛

快于埃氏筛,避免重复标记

思想

每个合数只被它的最小质因数筛去,这样就能保证每个合数只被筛一次

时间复杂度为 $ O$ ( $ n$ )

步骤

$ Step 1$
建立一个数列和质数数列 ($ 2$ 到 $ n$ )

$ Step 2$
取数,判断是否为质数,如果是用这个数乘遍质数数列中的数,即为合数,然后在数列中删去合数

Code

#include <bits/stdc++.h>

using namespace std;

int n;
int G = 0;
int prime[100000005];
bool ju[100000005];

void Get_Prime(int n) {
	ju[1] = 1;
	for (int i = 2; i <= n; i++) {
		if (!ju[i]) {
			prime[++G] = i;
		}
		for (int j = 1; j <= G && i * prime[j] <= n; j++) {
			ju[i * prime[j]] = 1;
			if (i % prime[j] == 0) break;
		}
	}
}

int main() {
	scanf("%d", &n);
	Get_Prime(n);
	for (int i = 1; i <= G; i++) {
		printf("%d\n", prime[i]);
	}
	return 0;
}

Part3 例题

P3383 线性筛

Code

#include <bits/stdc++.h>

using namespace std;

int n, q, k;
int prime[100000005];
bool ju[100000005];

void Get_Prime(int n) {
	int G = 0;
	ju[1] = 1;
	for (int i = 2; i <= n; i++) {
		if (!ju[i]) {
			prime[++G] = i;
		}
		for (int j = 1; j <= G && i * prime[j] <= n; j++) {
			ju[i * prime[j]] = 1;
			if (i % prime[j] == 0) break;
		}
	}
}

int main() {
	scanf("%d%d", &n, &q);
	Get_Prime(n);
	for (int i = 0; i < q; i++) {
		int k;
		scanf("%d", &k);
		printf("%d\n", prime[k]);
	}
	return 0;
}

参考文章

link

标签:埃氏,数列,int,ju,质数,合数,欧拉
From: https://www.cnblogs.com/Gery-blog/p/17429217.html

相关文章

  • hdu:gcd(欧拉函数)
    ProblemDescriptionThegreatestcommondivisorGCD(a,b)oftwopositiveintegersaandb,sometimeswritten(a,b),isthelargestdivisorcommontoaandb,Forexample,(1,2)=1,(12,18)=6.(a,b)canbeeasilyfoundbytheEuclideanalgorithm.NowCarpiscon......
  • The Euler function(欧拉函数)
    ProblemDescriptionTheEulerfunctionphiisanimportantkindoffunctioninnumbertheory,(n)representstheamountofthenumberswhicharesmallerthannandcoprimeton,andthisfunctionhasalotofbeautifulcharacteristics.Herecomesaverye......
  • 质数 埃氏
    #include<bits/stdc++.h>usingnamespacestd;defineN1000000intb[1000005],n,cnt;intmain(){ scanf("%d",&n); for(inti=2;i*i<=N;i++){ for(intj=i*i;j<=N;j+=i) b[j]=1; } for(inti=2;i<=N;i++)......
  • imu 话题数据,欧拉角
    header:消息头,包含序列号、时间戳和坐标系等信息。orientation:IMU的当前朝向,用四元数表示,包括$x,y,z$和$w$四个值。orientation_covariance:朝向协方差矩阵,包含$9$个元素,描述IMU测量的朝向误差。angular_velocity:IMU的角速度,包含$x,y,z$三个分量。ang......
  • 欧拉回路和欧拉路径
    哥尼斯堡七桥问题七桥问题时18世纪著名古典数学问题之一.在哥尼斯堡的一个公园里,有七座桥将河中两个岛及岛与河岸连接起来,问是否可能从这四块陆地中任一块出发,恰好通过每座桥一次,再回到起点欧拉于1736年研究并解决了此问题,并因此开创了数学的一个新的分支——图论与......
  • 浅谈欧拉函数
    求法设一个数x的各质因子为$p_1,p_2,...,p_n$则$\phi(x)=x-\frac{x}{p_1}-\frac{x}{p_2}-...-\frac{x}{p_n}+\frac{x}{p_1*p_2}+\frac{x}{p_2*p_3}+...=x*\frac{p_1-1}{p_1}*\frac{p_2-1}{p_2}*...*\frac{p_n-1}{p_n}$性质性质1若$n,m$互质,则$\phi(n*m)=\phi(n)*\phi(m)$证......
  • 欧拉函数性质证明
    欧拉函数性质前言:欧拉函数的定义\(\varphi(n)\)为\(1-n\)中与\(n\)互质的数。1证明:\(\varphi(1)=1\)\[\because只有1与1本身互质\\\therefore\varphi(1)=1\]2证明:\(当p是质数时,\varphi(p)=p-1\)\[\becausep是质数\\\therefore\forallx(1<x<p)gcd(x,p)=1\\\t......
  • php升级 编译安装php7 支持openeuler欧拉
    php版本下载包查询:https://www.php.net/releases/ yum-yinstallcmakelibxml2libxml2-developensslopenssl-develcurl-devellibjpeg-devellibpng-develfreetype-devellibziplibzip-devellibsodiumsqlitesqlite-develonigurumaoniguruma-devellibwebp-devel......
  • LightOJ1007---Mathematically Hard (欧拉函数)
    Mathematicallysomeproblemslookhard.Butwiththehelpofthecomputer,someproblemscanbeeasilysolvable.Inthisproblem,youwillbegiventwointegersaandb.Youhavetofindthesummationofthescoresofthenumbersfromatob(inclusive).T......
  • LCA——ST表+欧拉序
    了解到一个quan新的东西:用ST表(欧拉序)实现LCA(树上最近公共祖先)欧拉序前序遍历得到的序列,叫dfs序但数字可以重复出现,一进一出,叫欧拉序会发现根结点总在中间而根结点是该段序列深度最小的点因此两个点的LCA,就是在该序列上两个点第一次出现的区间内深度最小的那个点即转......