线性筛中每个数只会被最小的素因子筛一次

1)线性筛素数

 1 void getprime(int siz){
 2     memset(isprime,1,sizeof(isprime));
 3     isprime[1]=0;
 4     for(int i=2;i<=siz;i++){
 5         if(isprime[i])prime[++tot]=i;
 6         for(int j=1;j<=tot&&i*prime[j]<=siz;j++){
 7             isprime[i*prime[j]]=0;
 8             if(i%prime[j]==0)break;
 9         }
10     }
11 }

2)线性筛约数个数

每个数的约数个数为(a1+1)*(a2+1)*...*(ak+1),首先如果数i是素数,可以直接得到约数个数w[i]=2,又由于线性筛的时候,每个数是被最小素因子筛掉,所以如果i%prime[j]!=0,那么prime[j]将是i*prime[j]的最小素数,并且个数为1,所以w[i*prime[j]]=w[i]*(1+1),如果i%prime[j]==0,那么prime[j]既是i*prime[j]的最小素数,又是i的最小素数(因为prime[j]是i*prime[j]的最小素数嘛,所以不可能存在比prime[j]更小的素数),所以此时w[i*prime[j]]=w[i]/(n[i]+1)*(n[i*prime[j]]+1),其中n[i]表示i的最小素数的个数,那么显然n[i*prime[j]]=n[i]+1

 1 void getprime(int siz){
 2     memset(isprime,1,sizeof(isprime));
 3     isprime[1]=0;
 4     for(int i=2;i<=siz;i++){
 5         if(isprime[i]){prime[++tot]=i;w[i]=2;ww[i]=1;}
 6         for(int j=1;j<=tot&&i*prime[j]<=siz;j++){
 7             isprime[i*prime[j]]=0;
 8             if(i%prime[j]!=0){
 9                 w[i*prime[j]]=w[i]*2;
10                 ww[i*prime[j]]=1;
11             }
12             else{
13                 ww[i*prime[j]]=ww[i]+1;
14                 w[i*prime[j]]=w[i]/(ww[i]+1)*(ww[i*prime[j]]+1);
15                 break;
16             }
17         }
18     }
19 }

转载于:https://www.cnblogs.com/MekakuCityActor/p/10911238.html

[线性筛][筛素数/筛约数个数]相关推荐

  1. 利用线性筛算法框架求解因数个数以及因数和问题

    利用线性筛算法框架求解因数个数以及因数和问题 一 前言 关于线性筛算法,在前一篇文章 利用线性筛以及素数筛求某一范围内的所有素数中已经介绍过,若读者对线性筛算法不太了解或有所遗忘,可以点击链接查看.此 ...

  2. 筛表合集(素数筛 欧拉函数筛 莫比乌斯函数筛)

    [目录] 一.素数筛 1.素数判断 2.素数普通筛 3.素数线性筛 4.素数区间筛 二.欧拉函数筛 三.莫比乌斯函数筛 [素数筛] 1.直接判定质数 bool judgePrime( int num ...

  3. [数论]线性筛——约数个数与约数和

    参考博客 参考博客 参考博客 这个讲的挺好 预备知识点: 大于1的数n可以分解质因数: n=p1a1×p2a2×p3a3*-*pka n的约数的个数是(a1+1) * (a2+1) * (a3+1)- ...

  4. 【线性筛】【质因数分解】【约数个数定理】hdu6069 Counting Divisors

    d(x)表示x的约数个数,让你求(l,r<=10^12,r-l<=10^6,k<=10^7) #include<cstdio> using namespace std; ...

  5. bzoj2820 [bzoj2820]YY的GCD(线性素数筛+莫比乌斯反演)

    求gcd(i,j)为质数的个数.即 ∑p∑i=1n∑j=1mgcd(i,j)==p \sum\limits_p\sum\limits_{i=1}^n\sum\limits_{j=1}^mgcd(i,j ...

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

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

  7. c语言 快速筛质数,快速筛素数(埃式筛+线性筛+Miller_Rabin算法)

    在CF上做到一道核心是需要筛出1~n所有素数的题目,然后刚好又没学过,就学习了快速筛素数的办法,基础的n根号n的算法这里大家每个人都知道吧QAQ,就不讲了,好像还是C语言上机说过的题目. 首先给大家介 ...

  8. 面试官本拿求素数搞我,但被我优雅的“回击“了(素数筛)

    原创公众号(希望能支持一下):bigsai 转载请联系bigsai 文章收录在github 求star 前言 现在的面试官,是无数开发者的梦魇,能够吊打面试官的属实不多,因为大部分面试官真的有那么那几 ...

  9. 素数筛 Prime sieve

    文章目录 素数筛 Prime sieve 一.素数的判定 二.埃氏筛法 三.欧拉筛法 四.六倍原理 素数筛 Prime sieve 素数又称质数:一个大于 1 的自然数,除了 1 和它自身外,不能被其 ...

  10. [Hello World] 素数筛C语言实现及优化

    素数筛C语言实现及优化 一.概念 素数:素数(质数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. 素数筛:用素数标记合数(素数的整数倍都是合数),剩下的就是素数. 二.原理 规则 ...

最新文章

  1. 代码覆盖测试工具Kcov简介及使用
  2. 伺服驱动器接线怎么画_百格拉伺服驱动器维修常见故障现象及处理方法
  3. 前端开发需要掌握的SEO的知识点
  4. 滴滴经验分享:SQLFlow如何让运营专家用上AI?
  5. stm32 vscode 编译_vs code+gcc stm32编译环境搭建
  6. 代码质量 重构 代码鸡汤
  7. 贪 心 学用markdown
  8. eclipse中git的配置、提交代码、从远程导入代码
  9. 2017级C语言大作业 - 气球塔防
  10. Iocomp ActiveX/VCL Ultra Pack Crack
  11. 通信原理包络是什么意思_为什么齿轮不能少于17个齿,少于17个齿,齿轮传动会如何?...
  12. Ken Thompson 的经典 C 程序
  13. scp 是我小看了你---基于密钥传输!
  14. 线代9讲_特征值与特征向量相似理论
  15. android+删除相片代码,android删除手机照片
  16. 机器学习算法:kNN和Weighted kNN
  17. ValueError: could not convert string to float:
  18. 第二次作业——结对项目之需求分析与原型设计
  19. 如何获取微信公众号一键关注链接
  20. XLS和XLSX相同么?

热门文章

  1. DOS批处理高级教程:第二章 DOS循环for命令详解(转)
  2. 在Web.config配置文件中自定义配置节点
  3. 超详细mac新手教程-Mac界面篇
  4. FontExplorer X Pro for Mac字体管理软件
  5. Sketch 80 for mac(矢量绘图设计软件)
  6. PostgreSQL Excel包含中文字符的数据导入方法
  7. IOS学习之UITableView滚动到指定位置
  8. python shell 方向键不可用
  9. 「随机化快排」期望运行时间证明
  10. win7下声音图标消失的解决办法