欧拉筛是一个常用的基础算法,用欧拉筛主要有以下两个作用:
- 线性复杂度求筛出小于等于N的所有素数;
- 求出 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];
}