欧拉筛用法

欧拉筛是一个常用的基础算法,用欧拉筛主要有以下两个作用:

  1. 线性复杂度求筛出小于等于N的所有素数;
  2. 求出 2~N 范围内所有数的最小质因子;

欧拉筛算法的基本思路:

在埃氏筛的基础上作出优化,即保证每一个合数只会被其最小质因子筛掉。

代码理解:

vector<int> prime;//存储所有质数
int minp[N];//映射每个数的最小质因子
bool no_p[N];
for (int i = 2; i <= N; i++)
{
    if (!no_p[i])
    {
        prime.push_back(i);
        minp[i] = i;
    }
    for (int j = 0; j < prime.size() && prime[j] * i <= N; j++)
    {
        no_p[prime[j] * i] = 1;
        //此时prime[j]一定是prime[j] * i的最小质因子。因为此时i的最小质因子是比prime[j]大的。
        minp[prime[j] * i] = prime[j];
        //当 i%prime[j]==0 时prime[j]为i的最小质因子,为保证每个数只被最小质因子筛,这里break
    	if (i % prime[j] == 0)
            break;
    }
}

最小质因子的常见用法:

利用欧拉筛求出的最小质因子,可以在较低的复杂度求出一个数(2~N)的所有质因子,大致模板如下:

while(x!=1)
{
	prime_factor.push_back(minp[x]);
	x/=minp[x];
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值