【学习笔记】欧拉线性筛

欧拉线性筛

简介

欧拉线性筛主要用于求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时,jtot,iprime[j]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;
}
posted @   GuoSN0410  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示