线性筛和埃氏筛的用法及应用

原创 2018年04月17日 13:38:17

埃氏筛 我的理解:每次找到一个质数,就筛掉所有他的倍数,这样的话同一个数可能被筛掉多次,但是埃氏筛仍然有十分优越的复杂度

代码:

inline void get_prime(){
	bool limit[N];
	limit[0]=limit[1]=true;
	for(int i=2;i<=n;i++){
		if(!limit[i]){
			prime[++cnt]=i;
			for(int j=i*2;j<=n;j+=i)
				limit[j]=true;
		}
	}
}

欧拉筛(线性筛):只用该合数的最小质数因子筛去这个数,所以一个数最多被筛掉一次,复杂度较前者更优

代码:

inline void oula_get_prime(){
	bool limit[N];
	limit[0]=limit[1]=true;
	for(int i=2;i<=n;i++){
		if(!limit[i])
			prime[++cnt]=i;
		for(int j=1;j<=cnt&&prime[j]*i<=n;j++){
			limit[prime[j]*i]=true;
			if(i%prime[j]==0)
				break;//如果i已经是prime[j]的倍数,那么就可以退出了
		}
	}
}

洛谷 P1865 

求区间质数个数

输入格式:

一行两个整数 询问次数n,范围m

接下来n行,每行两个整数 l,r 表示区间

输出格式:

对于每次询问输出个数 t,如l或r∉[1,m]输出 Crossing the line

欧拉筛裸题 找完素数后用num[i]维护一下从1~i之间的素数个数就可以了

#include<bits/stdc++.h>
#define N 1000010
using namespace std;
int n,m,num[N],l,r,prime[N],cnt;
bool limit[N];
inline void get_prime(){
	limit[0] =limit[1]=true;
	for(int i=2;i<=m;i++){
		if(!limit[i])
			prime[++cnt]=i;
		for(int j=1;j<=cnt&&prime[j]*i<=m;j++){
			limit[prime[j]*i]=1;
			if(i%prime[j]==0){
				break;
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	get_prime();
	for(int i=1;i<=m;i++){
		if(!limit[i])
			num[i]=num[i-1]+1;
		else
			num[i]=num[i-1];
	}
	while(n--){
		scanf("%d%d",&l,&r);
		if(l<1||r>m)
			puts("Crossing the line");
		else
			printf("%d\n",num[r]-num[l-1]);
	}
}

计算机基础win7的基本用法

掌握计算机的基本操作,掌握win7的基本用法,达到自己计算机的平常维护,学会办公软件的用法,为继续学习IT技术打好基础。 win7基本用法和优化、备份,办公软件用法,多媒体用法
  • 2018年01月17日 11:15

【模板】线性筛素数(埃筛+欧筛)

本来想自己写一篇的,但是找埃筛的代码时找到了一篇不错的题解,修改了一点内容,原作者的洛谷ID为 dormantbs...
  • qq_37703887
  • qq_37703887
  • 2017-11-09 21:24:55
  • 142

埃氏筛法和欧拉筛法的区别

转自: 点击打开链接 Eratosthenes筛法(Sieve of Eratosthenes) 由于思想非常简单,故只给出实现。 1 2 3 ...
  • Baoli1008
  • Baoli1008
  • 2016-03-03 14:56:19
  • 3804

119_素数算法之 埃氏筛

寻找n以内的所有的素数,埃氏筛的实现原理如下:  如果发现一个素数,就将其倍数全都删去,那么数组中下一个未被删去的数一定是素数(也是数组中最小的那个数),反复执行,最后得到素数表。  复杂度为O(...
  • qq_31552435
  • qq_31552435
  • 2016-01-04 16:15:53
  • 475

Eratosthenes“埃氏筛法”求1000以内的素数C++

“埃氏筛法”是一种高效的求N以内素数的算法,时间复杂度为O(nloglogn),求100以内素数的“埃氏筛法”代码实现如下: #include #include int num[1001] = {0...
  • daiweijieshang
  • daiweijieshang
  • 2017-04-18 23:01:33
  • 868

filter:埃氏筛法,回数判断is_palindrome

python内建的filter用于过滤序列,也可以接收函数。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。...
  • lftaoyuan
  • lftaoyuan
  • 2017-11-24 13:59:28
  • 301

算法 埃氏筛法求素数个数

思路原理要得到自然数n以内的全部素数,必须把不大于根n的所有素数的倍数剔除,剩下的就是素数。给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,...
  • Thousa_Ho
  • Thousa_Ho
  • 2017-07-07 09:46:21
  • 554

埃式筛法

例:素数的个数 题意:给定整数n,请问n以内有多少个素数  (n 输入: 11 1000000 输出: 5 78498 #include using namespace std; const i...
  • a2459956664
  • a2459956664
  • 2016-04-08 19:24:25
  • 1689

埃氏筛法求素数-Python

def _not_divisible(n): #是否整除 return lambda x: x%n > 0 def _odd_iter(): #创建奇数序列 n = 1 wh...
  • hong3088
  • hong3088
  • 2017-03-01 23:54:22
  • 315

埃氏筛法 素数

今天 看了 《编程珠玑》  看到了 埃氏筛法   令我大为震惊  、、、、、、、、查找素数竟然 这么快  因此将 代码 贴出来 、、、、、、、、、、、 # include #includ...
  • duan1522630316
  • duan1522630316
  • 2012-11-18 21:21:36
  • 2440
收藏助手
不良信息举报
您举报文章:线性筛和埃氏筛的用法及应用
举报原因:
原因补充:

(最多只允许输入30个字)