欧筛,打素数表

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e6;
const ll Maxn=2*1e6+100;
int prime[maxn];
map<ll,ll> check;
ll cnt=0;
void Init_Prime()
{
    for(int i=2;i<=Maxn;i++)
    {
        if(check[i]==0)     prime[++cnt]=i;
        for(int j=1;j<=cnt&&prime[j]*i<Maxn;j++)                //唯一分解定理 欧筛
        {
            check[prime[j]*i]=1;
            if(i%prime[j]==0)   break;	//分解质因数:每次都要保证前面的因数<=后面的因数
        }

    }

}
int main()
{

    Init_Prime();
    for(int i=1;i<=50;i++)
        printf("%d ",prime[i]);
    printf("\n");
    return 0;
}

每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。如30=2×3×5 。分解质因数只针对合数。

欧筛实际上用到了分解质因数变形的原理:每个合数都可以分解成一个质数一个数(把分解质因数的剩下的n-1项乘起来) 的形式
每次check都要保证分解的因数 前面的<=后面的。
例如:check[24]的话,就是要2
12 ,而不是3*8

欧筛:是根据i为基本点,prime序列为倍数,来check序列
埃筛:是根据prime为基本点,i序列为倍数,来check序列

posted @ 2020-07-15 14:07  DuJunlong  阅读(13)  评论(0)    收藏  举报  来源