在前前前前前前…的博客中,我们主要谈了欧拉筛和埃氏筛.

今天我们主要来聊一聊线性筛和厄拉多塞筛(其实和埃氏筛和欧拉筛本质上没区别哎).其实在这两种筛法中厄拉多塞筛最好懂(就连本蒟蒻一看代码就明白了…别看这个名字,容易糊弄人)

首先是厄拉多塞筛"粉墨登场":::::::

厄拉多塞筛

厄拉多塞是个人名,因为这种筛法是他提出来的.

我们先讲一下大致的思路,我们example(举个栗子):

有一张写了2~n之间所有数的表,其中就包括这2和n.然后,我们从2开始一直到n划掉2的倍数.划完之后,我们发现3没有被划去,就证明3是质数,然后我们就在3~n当中划去是3倍数的数,以此类推.

此时,厄拉多塞筛的时间复杂度为

既然已经动了厄拉多塞筛的筛质数的方法,我们下面来就有请我们最喜欢的代码大军:

void ispri(){cin>>n>>m;a[1]=1;for(i=n;i<=m;i++){if(a[i]==1){continue;}else{for(j=2*i;j<=m;j+=i)a[j]=1;}}for(i=n;i<=m;i++){if(a[i]==0)cout<<i<<" ";}return;
}

既然代码大军都已经出来了,我们就接着奔赴下一个战场,线性筛

线性筛

由于厄拉多塞筛在筛30=2*3*5类似于这些数的时候,会被2,3,5重复多筛几次,这样就大大耗费的时间复杂度,因此,我们推出了新产品––线性筛.

线性筛的思路就是要保证每一个数都被他的最小质因子筛去.

首先,我们先亮出代码:

void ispri(){for(int i=2;i<=n;i++){if(isp[i]==0) pr[++cnt]=i;for(int j=1;j<=cnt&&pr[j]*i<=n;j++){isp[i*pr[j]]=1if(i%pr[j]==0) break;}}
}

保证每一个数只被他的最小的质因子筛去,代码中则体现在了i%pr[j]==0上面

pr数组中的质数是递增的,当pr[j]|i时,pr[j]|pj[j+1]i,那么pj[j+ 1]i这个合数应该被pr[j]这个更小的质数筛掉。另外,当pr[j]|i时,pr[j]是i的最小质因子。否则pr[j]是pr[j]i的最小质因子。

我们沿用线性筛的过程,考虑这个问题。首先,线性筛筛出质数的时候,我们需要求这个积性函数在质数处的取值。其次,在for循环中,设k=pr[j],当k|i时,由上面的讨论,k是i的最小质因子,设k在i中的幂次为a,那么

​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

否则,因为k是质数,那么gcd(k, i) = 1,那么f(ki) =f(k)f(i)。

懂了吗?我们来看下一步

线性筛欧拉函数

例:O(n)求出欧拉函数在1∼n处的所有取值。

由于,为一个定值,所以线性筛欧拉函数很容易。

代码如下:

for(int i=2;i<=n;i++){if(isp[i]==0){pr[++cnt]=i;phi[i]=i-1;}for(int j=1;j<=cnt&&pr[j]*i<=n;j++){isp[i*pr[j]]=1;if(i%pr[j]==0){phi[i*pr[j]]=phi[i]*pr[j];break;}phi[i*pr[j]]=phi[i]*(pr[j]-1);}
}

线性筛莫比乌斯函数

例:O(n)求出莫比乌斯函数在1∼n处的所有取值。

由于,为一个定值,所以也很容易。

for(int i=2;i<=n;i++){if(isp[i]==0){pr[++cnt]=i; mu[i]=-1;}for(int j=1;j<=cnt&&pr[j]*i<=n;j++){isp[i*pr[j]]=1;if(i%pr[j]==0) {mu[i*pr[j]]=0;break;}mu[i*pr[j]]=mu[i]*-1;}
}

线性筛求约数个数

例:O(n)求出约数个数函数τ在1∼n处的所有取值。

由于,不为一个定值,所以在筛的过程中还要维护i的最小质因子的次数。

for(int i=2;i<=n;i++){if(isp[i]==0){pr[++cnt]=i; tau[i]=2; g[i]=2;}for(int j=1;j<=cnt&&pr[j]*i<=n;j++){isp[i*pr[j]]=1;if(i%pr[j]==0){tau[i*pr[j]]=(g[i]+1)*tau[i]/g[i];g[i*pr[j]]=g[i]+1;break;}tau[i*pr[j]]=tau[i]*2;g[i*pr[j]]=2;}
}

今天的内容终于讲完了,感谢大家的聆听

筛法(线性筛,厄拉多塞筛)相关推荐

  1. 素数筛法(传统普通、朴素筛法、埃式筛法、欧拉筛法(线性筛))

    素数筛法(普通.朴素筛法.埃式筛法.欧拉筛法) 1.题目 2.分析 3.代码 传统普通 朴素筛法 朴素筛法(6.14) 埃式筛法 埃式筛法(6.14) 欧拉筛法(线性筛) 欧拉筛法(线性筛 6.14) ...

  2. 素数的线性筛法java,埃氏筛 线性筛(欧拉筛) 算法解析

    埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...

  3. P3383 【模板】线性筛素数

    https://www.luogu.com.cn/problem/P3383 //线性筛法 /* P3383 [模板]线性筛素数 https://www.luogu.com.cn/problem/P3 ...

  4. 信息学奥赛一本通 2040:【例5.7】筛选法找质数 (普通筛 线性筛)

    [题目链接] ybt 2040:[例5.7]筛选法找质数 [题目考点] 1. 普通筛法找质数(埃拉托色尼筛法) 基本思想:把从2到N的一组正整数从小到大按顺序排列.从中依次删除2的倍数.3的倍数.5的 ...

  5. 线性筛及其扩展-积性函数

    线性筛 埃氏筛 对于每个数\(x\),枚举其倍数,将\(kx\)筛去. 在埃氏筛过程中,每个数都会被筛掉多次,且对于每个数x,枚举其倍数的次数为\(\frac{n}{x}\) 故埃氏筛的时间复杂度为\ ...

  6. 埃氏筛 线性筛(欧拉筛) 算法解析

    埃氏晒 埃拉托斯特尼筛法,简称埃氏晒,是一种用来求自然数n以内的全部素数. 他的基本原理是,如果我们要获得小于n的所有素数,那就把不大于根号n的所有素数的倍数剔除. 埃氏晒的原理很容易理解,一个合数, ...

  7. 读贾志鹏线性筛有感 (莫比乌斯函数的应用)

    先拜大牛.感谢贾志鹏严谨的思维.以及简单清晰的论文描述. 一定要结合论文看.我只是提出我觉得关键的部分.论文在网上随处可见.贾志鹏线性筛. 开头两种线性筛的比较. 一种是传统的线性筛.时间复杂度为N* ...

  8. 质数 AcWing 868. 筛质数 线性筛

    质数 AcWing 868. 筛质数 原题链接 AcWing 868. 筛质数 算法标签 数学知识 质数 线性筛法筛法求素数 思路 线性筛,保证每个合数只被最小素因子筛掉 (1)当i%primes[j ...

  9. 素数筛线性筛详细详解(个人总结思路超长版)

    一.埃氏筛 由于传统的sqrt写法比较简单,直接进行相除看是否能整除即可,这里不想过多的介绍此种方法.大多数比赛中这种写法也只能用于判断少量数据或无需大表即可通过的题目.这里从此种埃氏筛开始介绍. 此 ...

最新文章

  1. 02HTML标签(上)
  2. LoadRunner 测试Oracle数据库及Siebel性能
  3. glassfish_多种监视和管理GlassFish 3的方法
  4. 【ACL2019】轻松了解张岳实验室的六篇paper
  5. 安装完wps去除右键新建中的wps等文档
  6. java坦克加快速度_Java坦克大战 (三) 之可完全控制坦克朝八个方向运动
  7. TCP 和 UDP 的区别 TCP 和 UDP 详解
  8. android问卷调查论文设计,基于 android问卷调查app开发与设计.pdf
  9. Linux下Sed命令的用法 - Linux - 红黑联盟
  10. 极端类别不平衡数据下的分类问题研究综述,终于有人讲全了!
  11. flink Table Api 理论篇
  12. python输出图形效果的代码_使用Python实现图像标记点的坐标输出功能
  13. 【GCC】2: RTCP cc-feeback 抓包对比协议
  14. 课程1 谈论你喜欢的音乐
  15. angr - re - ais3_crackme
  16. f2fs系列文章truncate
  17. 李大潜:学习数学是战略性投资【导图版】
  18. argo 现水下永动机器人_【现水下永动机器人是怎么回事?水下永动机器人】_永动机 水下_全球新能源网...
  19. 红米6.apk软件安装失败:其他原因
  20. # HenCoder Android 自定义 View 1-8 硬件加速

热门文章

  1. 2022年7月份模拟考题-附加题解答
  2. Confluence 你可以对编辑器中的表格进行什么样的操作
  3. 小步快跑是这样玩的(上)
  4. jmeter下载(JMeter怎么读)
  5. SSH开发银联在线支付
  6. 阿里云国际版账户登录不上,有什么办法解决吗?
  7. NEB方法计算离子扩散路径和能垒(过渡态的计算)
  8. proguard学习
  9. Pycaffe 使用集锦
  10. 动态正17边光阑Canvas代码,借此向十九世纪伟大数学家高斯致敬