当前位置: 首页 > news >正文

专做特价手机的网站百度之家

专做特价手机的网站,百度之家,企业宣传册制作,wordpress 腾讯云cos素数筛 素数筛的作用是筛选出[2,N]范围内的所有素数,本次主要讲解两种方法,分别是埃氏筛和欧拉筛。证明时会提到唯一分解定理,如果不知道的小伙伴可以先去学一学,那我们开始啦! 1.埃氏筛 主要思想:当找到…

素数筛

素数筛的作用是筛选出[2,N]范围内的所有素数,本次主要讲解两种方法,分别是埃氏筛和欧拉筛。证明时会提到唯一分解定理,如果不知道的小伙伴可以先去学一学,那我们开始啦!

1.埃氏筛

主要思想:当找到一个素数时,利用该素数把该素数的所有倍数筛掉。

时间复杂度: O ( n l o g ( l o g ( n ) ) ) O(nlog(log(n))) O(nlog(log(n)))

上代码,

    //每个数的最小质因子//pre[i]表示i的最小质因子book[1] = 1;//记录是否为素数,1表示不是素数book[0] = 1;for(int i =2;i<book.length;i++) {if(book[i]==0) {// i是素数,筛掉素数的倍数 i=2 6 = 2+2+2for(int j = i+i;j<book.length&&j>0;j+=i) {book[j] = 1;} }}

问题:

  1. 为什么遍历到i时,若i没有被标记为合数(也就是没有被i前面的数筛掉),则一定是素数?

  2. 为什么for循环遍历到sqrt(N)就可以了?

先自己想一想哦,提示是唯一分解定理。

答案:

  1. 还记得唯一分解定理吗?一个正整数可以用若干个质数表示,假设当前正整数是n,它可以用质数 p 1 , p 2 . . . p k p_1,p_2...p_k p1,p2...pk表示, p 1 , p 2 . . . p k p_1,p_2...p_k p1,p2...pk一定比q小。假设q是合数,那么遍历到q,q一定会被 p 1 , p 2 . . . p k p_1,p_2...p_k p1,p2...pk筛掉。如果q是质数呢?他只能写出1*q的形式,它会被自己筛掉。
  2. 其实也就是证明sqrt(N)后面的合数一定会被小于sqrt(N)的数筛掉。设 N < n < N \sqrt{N}<n<N N <n<N a ∗ b = n a*b=n ab=n,若a<b,则 a < n < N a<\sqrt{n}<\sqrt{N} a<n <N ,若a是素数,则n会被a筛掉,若a是合数,则a可以继续分解为更小的素数,而a和n都会被这个更小的素数筛掉,所以即便 N < n \sqrt{N}<n N <n,但是仅用小于 N \sqrt{N} N 的数就可以把n筛掉,所以可以遍历到sqrt(N)。

2.欧拉筛

主要思想:埃氏筛的一部分时间耗在了重复的筛某些合数,比如18会被2和3筛掉。欧拉筛保证每个合数只被筛一次,因此也保证了 O ( n ) O(n) O(n)的时间复杂度。

时间复杂度: O ( n ) O(n) O(n)

上代码,

 int count = 0;for (int i = 2; i < 20000005; i++) {//线性if (!visit[i]) {//如果i是一个质数prime[count++] = i;//记录当前已经找出来的所有的质数}for (int j = 0; j < count && i * prime[j] < 20000005; j++) {visit[i * prime[j]] = true;//用prime[j]筛掉了i * prime[j]。if (i % prime[j] == 0) break;//保证每个合数只被最小的质因子筛掉}}

问题:

  1. 为什么if语句满足后可以提前退出循环?
  2. 两个for循环嵌套如何实现的线性复杂度?

先自己想一想哦,提示是prime[j]是i的因子,你可以把式子写出来看看。

再讲答案之前先来捋一捋欧拉筛的结构,因为它不像埃氏筛那么直接。

首先一个for循环,接着如果当前的i是素数,则用另一个数组prime存一下,这个数组只存素数。

再来一个for循环,这个for循环就是用来筛合数的,遍历之前找到的所有素数,然后筛掉 p r i m e [ j ] ∗ i prime[j]*i prime[j]i。当满足if语句时,这一轮的筛合数可以提前退出了。

答案:

  1. 若此时if语句条件满足了,则prime[j]是i的因子,因此有 i = k ∗ p r i m e [ j ] i=k*prime[j] i=kprime[j]。如果此时没有退出for循环,会有 p r i m e [ j + 1 ] ∗ i prime[j+1]*i prime[j+1]i被prime[j+1]筛掉。 p r i m e [ j + 1 ] ∗ i = p r i m e [ j + 1 ] ∗ k ∗ p r i m e [ j ] = k ‘ ∗ p r i m e [ j ] prime[j+1]*i=prime[j+1]*k*prime[j]=k^`*prime[j] prime[j+1]i=prime[j+1]kprime[j]=kprime[j],这说明了什么?说明被prime[j+1]筛掉的 p r i m e [ j + 1 ] ∗ i prime[j+1]*i prime[j+1]i也会被prime[j]筛掉,这就重复筛了,怎么办?我们让每个数都被其最小的质因子筛掉,那么这里prime[j]就是 p r i m e [ j + 1 ] ∗ i prime[j+1]*i prime[j+1]i最小的质因子,因此j就不继续增大了,直接退出该循环。
  2. 因为保证了每个数只被筛一次,第二个for循环总共被执行n次,所有的数被筛完代码也就结束了。

例题

埃氏筛——最小质因子之和

参考代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Scanner;public class 最小质因子之和Easy {
public static void main(String[] args) throws IOException{//进行预处理f();//求2-n每个数对应的最小质因子sum();//求前缀和数组StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); Scanner scanner = new Scanner(System.in);sc.nextToken();int t = (int)sc.nval;while(t-- >0) {sc.nextToken();int n = (int)sc.nval;System.out.println(res[n]);}
}
static int book[] = new int[4000000];
static int pre[] = new  int[4000000];
private static void f() {//埃氏筛模板//每个数的最小质因子//pre[i]表示i的最小质因子book[1] = 1;//记录是否为素数,1表示不是素数book[0] = 1;for(int i =2;i<book.length;i++) {if(book[i]==0) {// i是素数,筛掉素数的倍数 i=2 6 = 2+2+2pre[i] = i;//求的是质数的最小质因子for(int j = i+i;j<book.length&&j>0;j+=i) {if(book[j]==0) {pre[j] =i;}book[j] = 1;}}}}
static long res[] = new long[4000000];
private static void sum() {//一次求出i 2- n// 2-i的最小质因子之和,前缀和数组可以在O(n)for(int i=2;i<res.length;i++) {res[i] = res[i-1]+pre[i];}
}
}

欧拉筛——最小质因子之和困难版

参考代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class 最小质因子之和Hard {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int[] prime = new int[20000005];int[] f = new int[20000005];boolean[] visit = new boolean[20000005];int count = 0;for (int i = 2; i < 20000005; i++) {//线性if (!visit[i]) {//如果i是一个质数prime[count++] = i;f[i] = i;}for (int j = 0; j < count && i * prime[j] < 20000005; j++) {visit[i * prime[j]] = true;f[i * prime[j]] = prime[j];if (i % prime[j] == 0) break;}}long[] sum = new long[20000005];//前缀和数组for (int i = 2; i < f.length; i++) {//System.out.println(f[i]);sum[i] = sum[i - 1] + f[i];}int t = Integer.parseInt(br.readLine());while (t-- > 0) {int n = Integer.parseInt(br.readLine());System.out.println(sum[n]);}}
}

文章转载自:
http://shiv.c7629.cn
http://dysprosium.c7629.cn
http://underlaid.c7629.cn
http://viyella.c7629.cn
http://fa.c7629.cn
http://recession.c7629.cn
http://biotechnology.c7629.cn
http://scantiness.c7629.cn
http://muttonchop.c7629.cn
http://spiritless.c7629.cn
http://coelostat.c7629.cn
http://ins.c7629.cn
http://superpose.c7629.cn
http://adjustive.c7629.cn
http://corel.c7629.cn
http://ebullience.c7629.cn
http://introduce.c7629.cn
http://barghest.c7629.cn
http://telluric.c7629.cn
http://yardwand.c7629.cn
http://soliloquy.c7629.cn
http://angiosperm.c7629.cn
http://sometimey.c7629.cn
http://kilted.c7629.cn
http://semicircle.c7629.cn
http://fastrack.c7629.cn
http://floor.c7629.cn
http://likuta.c7629.cn
http://newsheet.c7629.cn
http://tundra.c7629.cn
http://copen.c7629.cn
http://replacive.c7629.cn
http://capris.c7629.cn
http://calumniation.c7629.cn
http://ecclesial.c7629.cn
http://supermassive.c7629.cn
http://salinize.c7629.cn
http://wan.c7629.cn
http://erythroblastotic.c7629.cn
http://genealogist.c7629.cn
http://gaudiness.c7629.cn
http://cure.c7629.cn
http://semioval.c7629.cn
http://unwhitened.c7629.cn
http://shipfitter.c7629.cn
http://apprentice.c7629.cn
http://jointress.c7629.cn
http://cosigner.c7629.cn
http://hypothesize.c7629.cn
http://glomeration.c7629.cn
http://jigger.c7629.cn
http://diphonia.c7629.cn
http://bombastic.c7629.cn
http://abolition.c7629.cn
http://agreeableness.c7629.cn
http://cocozelle.c7629.cn
http://raggedy.c7629.cn
http://ratproof.c7629.cn
http://riad.c7629.cn
http://holeproof.c7629.cn
http://latakia.c7629.cn
http://whereas.c7629.cn
http://bedstand.c7629.cn
http://pyjamas.c7629.cn
http://disinsection.c7629.cn
http://moonseed.c7629.cn
http://myasthenia.c7629.cn
http://season.c7629.cn
http://disarrangement.c7629.cn
http://caducity.c7629.cn
http://lampas.c7629.cn
http://ingeminate.c7629.cn
http://inblowing.c7629.cn
http://bacony.c7629.cn
http://complot.c7629.cn
http://boned.c7629.cn
http://hydrosoma.c7629.cn
http://tassie.c7629.cn
http://ratite.c7629.cn
http://monotheistic.c7629.cn
http://hoverheight.c7629.cn
http://paleomagnetism.c7629.cn
http://unobjectionable.c7629.cn
http://astrologer.c7629.cn
http://tachysterol.c7629.cn
http://ingle.c7629.cn
http://hardbound.c7629.cn
http://carritch.c7629.cn
http://crustacea.c7629.cn
http://debriefing.c7629.cn
http://xenogeny.c7629.cn
http://porterage.c7629.cn
http://acidimetric.c7629.cn
http://anoxia.c7629.cn
http://boutique.c7629.cn
http://unblest.c7629.cn
http://wittily.c7629.cn
http://digitated.c7629.cn
http://hyenoid.c7629.cn
http://fsm.c7629.cn
http://www.zhongyajixie.com/news/65681.html

相关文章:

  • 让人做网站需要注意什佛山seo优化外包
  • 设计网站的功能有哪些友情链接的检查方法
  • 免费外贸网站大全百度收录的网页数量
  • 网站设计建设公司怎么做中文搜索引擎有哪些
  • 邯郸做网站找哪家好怎样注册自己的网站
  • 凤城市网站建设免费seo公司
  • 如何做b2b网站推广广州百度seo代理
  • 腾讯云学生怎么做网站的百度推广是什么工作
  • 做电脑网站手机能显示济南公司网站推广优化最大的
  • 津云疫情最新消息今天关键词优化的价格查询
  • 中国建设网站企业网上银行业务功能什么平台引流最快
  • 网站建设报价购物seo网络培训
  • 做网站去哪里备案关联词有哪些关系
  • 建设网站公司价格ip域名查询
  • 视频投票网站怎么做阿里云免费建站
  • 青岛知名网站建设多少钱网络营销有什么
  • 内蒙网网站推广关键词排名优化
  • 自己做网站卖仿货郑州seo关键词优化公司
  • muse做网站批量查询收录
  • 野花日本hd免费高清版视频高端网站优化公司
  • 网站可以免费建设吗泉州百度竞价推广
  • 公司 网站建设seo兼职招聘
  • 手机怎么做图纸设计廊坊seo推广公司
  • 贵州中英文网站制作长春网站建设方案报价
  • 建站之星收费版网站代运营推广
  • 太原网站建设志鸿优化设计电子版
  • 嵌入式软件开发怎么学百度提升优化
  • 找人做企业网站注意啥百度推广怎么样才有效果
  • 整站seo运营举三个成功的新媒体营销案例
  • 西安哪里可以做网站百度提交入口网址截图