欧拉线性筛

时间:2021-09-13
本文章向大家介绍欧拉线性筛,主要包括欧拉线性筛使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

原理

基本思想 :
在埃氏筛法的基础上,让每个合数只被它的最小质因子筛选一次,以达到不重复的目的。
关键:
if(i%prime[j]==0)break;
理解:

  • 当 i是prime[j]的倍数时,i = k × prime[j],
  • 如果继续运算 j+1,
    • i × prime[j + 1] = prime[j] × k × prime[j+1]
  • 这里prime[j]是最小的素因子,当i = k × prime[j+1]时会重复,
  • 所以跳出循环。

举个例子 :

  • i = 8 ,j = 1,prime[j] = 2,

如果不跳出循环,

  • prime[j+1] = 3, 8 * 3 = 2 * 4 * 3 = 2 * 12,
    在i = 12时会计算。

代码

bool visited[100100];//初始化
long long prime[100100];//保存素数
int cnt;

void Euler_prime()
{
    memset(visited, true,sizeof (visited) );
    visited[1]=false;
    for(int i=2;i<100100;i++)
    {
        if(visited[i]) prime[cnt++]=i;
        for(int j=0;j<cnt&&i*prime[j]<100100;j++)
        {
            visited[i*prime[j]] = false;
            if(i%prime[j]==0)//关键
                break;
        }
    }
}

实战

原文地址:https://www.cnblogs.com/kingwz/p/15264623.html