#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]的话,就是要212 ,而不是3*8
欧筛:是根据i为基本点,prime序列为倍数,来check序列
埃筛:是根据prime为基本点,i序列为倍数,来check序列