第一次写博客。

今天学了两个很简单的定理,老是忘记细看,今天可算看了下。

其中一个是

素数打表的优化

首先先理解了简单的埃筛法;

埃筛法就是把表中全部数为素数的倍数一个个筛除,最后只有素数留在表中。

#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 100000
int check[maxn]={0};
int prime[maxn]={0};
int main()
{int n, cnt = 0;while(~scanf("%d",&n)){int num=0;memset(check,0,sizeof(check));for(int i=2;i<=n;i++){if(check[i]==0)prime[num++]=i;for(int j=i+i;j<=n;j+=i)        //素数的倍数全部标记{check[j]=1;}}for(int i=0;i<num;i++)printf("%d ",prime[i]);}         //埃筛法return 0;
}

时间复杂度为O(n loglog n);

接下来是更为优化的欧拉线性筛法(时间复杂度为O(n))

/*求小于等于n的素数的个数*/
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{int n, cnt = 0;int prime[100001];//存素数 bool vis[100001];//保证不做素数的倍数 scanf("%d", &n);memset(vis, false, sizeof(vis));//初始化 memset(prime, 0, sizeof(prime));for(int i = 2; i <= n; i++){if(!vis[i])//不是目前找到的素数的倍数 prime[cnt++] = i;//找到素数~ for(int j = 0; j<cnt && i*prime[j]<=n; j++){vis[i*prime[j]] = true;//找到的素数的倍数不访问 if(i % prime[j] == 0) break;//关键!!!! }}printf("%d\n", cnt);return 0;
}

if(i % prime[j] == 0) break;←_←这一步比较难理解
解释:
      首先,任何合数都能表示成多个素数的积。所以,任何的合数肯定有一个最小质因子。我们通过这个最小质因子就可以判断什么时候不用继续筛下去了。

当i是prime[j]的整数倍时(i % prime[j] == 0),i*prime[j+1]肯定被筛过,跳出循环。

因为i可以看做prime[j]*某个数X, i*prime[j+1]就可以看做 prime[j]*x*prime[j+1] 。而 prime[j] 必定小于 prime[j+1],

所以 i*prime[j+1] 这个合数已经被X*prime[j](prime[j]是这个合数的最小质因子)筛掉,就不用再做了

也就是:

i=prime[j]*x;

合数=i*prime[j+1]=i*prime[j]*x;        //prime[j]是合数的最小质因子!

同时我们可以发现在满足程序里的两个条件的时候,prime[j]必定是prime[j]*i的最小质因子。这个性质在某些题里可以用到。

/*参考了http://www.cnblogs.com/A-S-KirigiriKyoko/articles/6034572.html

ACM素数打表(模版)相关推荐

  1. ACM模板 素数打表

    下面的是  欧拉筛法  更快更方便更好用的进行素数打表 /*===================================================*\欧拉筛法 素数打表,该函数执行后p ...

  2. 【HDU/POJ/ZOJ】Calling Extraterrestrial Intelligence Again (素数打表模板)

    http://poj.org/problem?id=1411  POJ http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=168 ...

  3. LightOJ 1259 Goldbach`s Conjecture 素数打表

    题目大意:求讲一个整数n分解为两个素数的方案数. 题目思路:素数打表,后遍历 1-n/2,寻找方案数,需要注意的是:C/C++中 bool类型占用一个字节,int类型占用4个字节,在素数打表中采用bo ...

  4. 筛法求素数 素数打表

    c++ #include<cstdio> #include<cstring> #include<cmath>//素数打表 ,时间复杂度:O(nlog n) char ...

  5. LightOJ-1220 Mysterious Bacteria (素数打表+欧几里得算法+唯一分解定理)给出x,求x=a^p,最大的指数

    题目大意: x = b^p, x只有一个因子的p次幂构成 如果24 = 2^3*3^1,p应该是gcd(3, 1) = 1,即24 = 24^1 324 = 3^4*2^2=(3^2*2)^2,p应该 ...

  6. Aladdin and the Flying Carpet (素数打表+正整数的唯一分解定理,找因数对)

    题目大意:给两个数a,b,求满足c*d==a且c>=b且d>=b的c,d二元组对数,(c,d)和(d,c)属于同一种情况 题目分析:根据唯一分解定理先将a唯一分解,则a的所有正约数的个数为 ...

  7. Codeforces Round #315 (Div. 2C) 568A Primes or Palindromes? 素数打表+暴力

    题目:Click here 题意:π(n)表示不大于n的素数个数,rub(n)表示不大于n的回文数个数,求最大n,满足π(n) ≤ A·rub(n).A=p/q; 分析:由于这个题A是给定范围的,所以 ...

  8. POJ 3126 Prime Path(BFS + 素数打表)

    题意:给定两个四位素数, 从一个素数到另一个素数,最少用几步,可以一次更改四位中的任意一位,但每次改变都只能是素数. 解题思路:四位数每一位情况有十种情况0-9, 四位共有40种情况, 枚举40种情况 ...

  9. UVA 10006(卡迈克尔数+素数打表)

    uva10006 Carmichael Numbers(卡迈克尔数+素数打表) 发表于2017/2/20 21:43:25  16人阅读 分类: 其他oj 数论-组合数学 https://uva.on ...

最新文章

  1. RDA8955烧写程序摘要
  2. Java 里的 abstract 和 final 关键字
  3. Java中几种常量池的区分
  4. mysql 字段钳口可加引号_根据处理对象划分,计算机可以分为模拟计算机、(
  5. RuntimeError: expected backend CUDA and dtype Float but got backend CUDA and dtype Long
  6. VB LISTBOX
  7. python rest 框架,[Python自学] restframework
  8. 【接口时序】8、DDR3驱动原理与FPGA实现(一、DDR的基本原理)
  9. 曾宪武《物联网通信技术》课后答案(三)
  10. ubuntu stardict词典安装
  11. 置换贴图,法线贴图和凹凸贴图详解
  12. vscdoe常用快捷键
  13. 优化算法:《Lookahead Optimizer: k steps forward, 1 step back》
  14. 算法:如何判断两颗二叉树是否相等
  15. 中外文献图书网址汇总
  16. 计算机修改用户名密码,怎么修改电脑用户名
  17. 2022-Arch安装(详细)
  18. JS中的`DOM`增删修
  19. [刷题]leetcode\977_有序数组的平方
  20. 【机器学习入门基础】Matrix

热门文章

  1. Framer 指南:从设计到编程、组件及其它
  2. 交互工具 Framer 中文网全面更新,你可以分享灵感啦
  3. echarts 环状图中添加图片
  4. 深入了解MSB和LSB
  5. ACAC java中final关键字
  6. 网站实现发送帖子的功能
  7. 佟年计算机大赛,《亲爱的,热爱的》热播,吴白见到佟年第一眼,这眼神亮了!...
  8. GetKeyState()和GetAsyncKeyState()的区别
  9. 如何在论文中表格和图片变成引用格式,实现ctrl访问
  10. 使用iCheck插件,如何创建chenge事件