欧筛,打素数表

#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序列

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值