( 数论专题 )【 欧拉筛 】

( 数论专题 )【 欧拉筛 】

线性筛是一个很基础的算法,但是我一直没学。直到一次考试,因为O(n√n)会超时,用了表筛,结果被卡了代码长度,于是开始学习欧拉筛。

算法思路:

  对于每一个数(无论质数合数)x,筛掉所有小于x最小质因子的质数乘以x的数。比如对于77,它分解质因数是7*11,那么筛掉所有小于7的质数*77,筛掉2*77、3*77、5*77。

  好吧,是不是听起来太简单了。。。。没事,重点在证明。

算法证明:

  首先我们要明确证明思路。如果要证明它是对的,只要保证两点:没用重复筛、没有漏筛

  1、没有重复筛。

    我们假设一个合数分解成p1*p2*p3,并且保证p1p1,所以这样是筛不到的。唯一会筛的是第一种:p1和p2*p3。

  2、没有漏筛。

  还是假设把这个合数分解质因数a*b*c,保证a

证明没看懂的直接看代码吧。。挺好背的。

#include 
#define int long long

using namespace std;

const int maxn = 2e6+10;
int primes[maxn],cnt;
bool isprime[maxn];

void get_prime()
{
    memset(isprime,true,sizeof(isprime));
    for ( int i=2; i<=maxn; i++ ) {
        if ( isprime[i]==true ) primes[cnt++]=i;
        for ( int j=0; j

 

你可能感兴趣的:(算法树之数论)