欧拉线性筛

欧拉线性筛

原理:

把每个合数只用被最小质数因子筛掉。

代码步骤:

数组:

bool isprime [maxn] //i是否为质数

int primes[maxn],cnt=0; //存质数和质数个数

步骤:

·将所有除0、1数字当成质数。

·i从2 to maxn开始循环:

如果i是质数:加入到primes数组中

j从1 to i*primes[j]<maxn开始循环:

​ 筛掉i*primes[j];

如果i是primes[j]的整数倍=>break

Code

void Euler(){
	memset(isprime,1,sizeof(isprime));
	isprime[0]=isprime[1]=1;
	for(int i=2;i<maxn;i++){
		if(isprime[i]) primes[++cnt]=i;
		for(int j=1;i*primes[j]<maxn;j++){
			isprime[i*primes[j]]=0;
			if(i%primes[j]==0) break;
		}
	}
}

其他:求l到r中的质数个数

引入前缀数组num[maxn],表示1~i中的质数个数。

Euler函数预处理后,i从1 to maxn循环,num[i]=isprime[i]?num[i-1]:num[i-1]+1;

输出时输出num[r]-num[l-1];

Code

	Euler();
	for(int i=1;i<=maxn;i++){
		num[i]=num[i-1];
		if(isprime[i]) num[i]++;
	}
int a,b;
	while(~scanf("%d%d",&a,&b)) printf("%d
",num[b]-num[a-1]);
原文地址:https://www.cnblogs.com/saitoasuka/p/10330935.html