欧拉筛法
普通的筛法,即Eratosthenes筛法,复杂度为 O(nloglogn) ,当范围大时,就扛不住了,需要利用欧拉筛法,也称线性筛法,下面还会介绍利用欧拉筛法的优美性质来求积性函数。
先给出欧拉筛法的代码:
for(int i=2;i<=n;i++){
if(vis[i])prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&prime[j]*i<=n;j++){
vis[i*prime[j]]=0;
if(!(i%prime[j]))break;
}
}
欧拉筛法的思想是:
1.如果这个数是质数,那么就将它与之前的质数的乘积挖掉
2.如果这个数是合数,那么就将它与从2到它最小的质因子之间的质数的乘积分别挖掉
考虑一个数 n=p1k1∗p2k2∗...... ,对于大于p1的质数j,令 k′=