欧拉线性筛

目录

欧拉线性筛

原理:

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

代码步骤:

数组:

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\n",num[b]-num[a-1]);

猜你喜欢

转载自www.cnblogs.com/saitoasuka/p/10330935.html