ACM素数打表(模版)
第一次写博客。
今天学了两个很简单的定理,老是忘记细看,今天可算看了下。
其中一个是
素数打表的优化
首先先理解了简单的埃筛法;
埃筛法就是把表中全部数为素数的倍数一个个筛除,最后只有素数留在表中。
#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素数打表(模版)相关推荐
- ACM模板 素数打表
下面的是 欧拉筛法 更快更方便更好用的进行素数打表 /*===================================================*\欧拉筛法 素数打表,该函数执行后p ...
- 【HDU/POJ/ZOJ】Calling Extraterrestrial Intelligence Again (素数打表模板)
http://poj.org/problem?id=1411 POJ http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=168 ...
- LightOJ 1259 Goldbach`s Conjecture 素数打表
题目大意:求讲一个整数n分解为两个素数的方案数. 题目思路:素数打表,后遍历 1-n/2,寻找方案数,需要注意的是:C/C++中 bool类型占用一个字节,int类型占用4个字节,在素数打表中采用bo ...
- 筛法求素数 素数打表
c++ #include<cstdio> #include<cstring> #include<cmath>//素数打表 ,时间复杂度:O(nlog n) char ...
- 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应该 ...
- Aladdin and the Flying Carpet (素数打表+正整数的唯一分解定理,找因数对)
题目大意:给两个数a,b,求满足c*d==a且c>=b且d>=b的c,d二元组对数,(c,d)和(d,c)属于同一种情况 题目分析:根据唯一分解定理先将a唯一分解,则a的所有正约数的个数为 ...
- 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是给定范围的,所以 ...
- POJ 3126 Prime Path(BFS + 素数打表)
题意:给定两个四位素数, 从一个素数到另一个素数,最少用几步,可以一次更改四位中的任意一位,但每次改变都只能是素数. 解题思路:四位数每一位情况有十种情况0-9, 四位共有40种情况, 枚举40种情况 ...
- UVA 10006(卡迈克尔数+素数打表)
uva10006 Carmichael Numbers(卡迈克尔数+素数打表) 发表于2017/2/20 21:43:25 16人阅读 分类: 其他oj 数论-组合数学 https://uva.on ...
最新文章
- RDA8955烧写程序摘要
- Java 里的 abstract 和 final 关键字
- Java中几种常量池的区分
- mysql 字段钳口可加引号_根据处理对象划分,计算机可以分为模拟计算机、(
- RuntimeError: expected backend CUDA and dtype Float but got backend CUDA and dtype Long
- VB LISTBOX
- python rest 框架,[Python自学] restframework
- 【接口时序】8、DDR3驱动原理与FPGA实现(一、DDR的基本原理)
- 曾宪武《物联网通信技术》课后答案(三)
- ubuntu stardict词典安装
- 置换贴图,法线贴图和凹凸贴图详解
- vscdoe常用快捷键
- 优化算法:《Lookahead Optimizer: k steps forward, 1 step back》
- 算法:如何判断两颗二叉树是否相等
- 中外文献图书网址汇总
- 计算机修改用户名密码,怎么修改电脑用户名
- 2022-Arch安装(详细)
- JS中的`DOM`增删修
- [刷题]leetcode\977_有序数组的平方
- 【机器学习入门基础】Matrix