这是两种简单的素数筛法, 好不容易理解了以后写篇博客加深下记忆 首先, 这两种算法用于解决的问题是 : 求小于n的所有素数 ( 个数 ) 比如 这道题 在不了解这两个素数筛算法的同学, 可能会这么写一个isPrime, 然后遍历每一个数, 挨个判断 : 从2判断到n-1 bool isPrime(int n) { for (int i = 2; i < n; i++) if (n % i == 0) return false; return true; } 从2判断到\(\sqrt{n}\) b…
目录 一.素数筛的定义 二.埃氏筛法(Eratosthenes筛法) 三.线性筛法 四.一个性质 一.素数筛的定义 给定一个整数n,求出[1,n]之间的所有质数(素数),这样的问题为素数筛(素数的筛选问题). 二.埃氏筛法(Eratosthenes筛法) 埃氏筛法又叫做Eratosthenes筛法,一般叫做埃氏筛.埃氏筛的思想是: \(\forall x\in Z\)的倍数\(2x,3x,...\)都不是质数. 因此我们可以从2开始有小到大扫描每个数\(x\),并把\(x\)的倍数\(2x,3x…
求素数 题目描述 求小于n的所有素数的数量. 输入 多组输入,输入整数n(n<1000000),以0结束. 输出 输出n以内所有素数的个数. 示例输入 10 0 示例输出 4 提示 以这道题目为例,要找出n以内的素数, n<=1000000. 为了节省时间,用素数筛 先把1000000以内的素数全部标记出来! 埃拉托斯特尼筛法,此素数筛核心算法代码: 这样跑完这个代码,是素数的会标记为0, 不是素数的标记为1.  数据处理完毕! int f[1000004]; int i, j; memset…
哥德巴赫猜想 Time Limit: 2000/1000ms (Java/Others) Problem Description: 哥德巴赫猜想大概是这么一回事:“偶数(>=4) == 两个质数的和”,至于是不是.成不成立,随它吧. Input: 多组数据,每组一个偶数n(4<=n<=10^6) Output: 若能分解则输出这两个质数,若有多解则按小数优先规则输出全部解,若无解则输出"No"; Sample Input: 16 Sample Output: 3 13…
素数(Prime)及判定 定义 素数又称质数,一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数,否则称为合数. 1既不是素数也不是合数. 判定 如何判定一个数是否是素数呢?显然,我们可以枚举这个数的因数,如果存在除了它本身和1以外的因数,那么这个数就是素数. 在枚举时,有一个很简单的优化:一个合数\(n\)必有一个小于等于\(\sqrt{n}\)的因数. 证明如下: 假设一个合数\(n\)没有小于等于\(\sqrt{n}\)的因数. 由于\(n\)为合数,所以除了\(n\)与…
素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功. 基本原则就是题目如果只需要判断少量数字是否为素数,直接枚举因子2 ..N^(0.5) ,看看能否整除N. 如果需要判断的次数较多,则先用下面介绍的办法预处理. 一般的线性筛法 首先先介绍一般的线性筛法求素数 void make_prime() { memset(prime, , sizeof(prime)); prime[]=false; prime[]=false; ; ; i<N; i++) if (prime[i]) { pr…
一.线性筛法 众所周知...线性筛就是在O(n)的时间里找出所有素数的方法 code: void get_prime(int N){ int i, j, k; memset(Flag, ); ; i <= N; ++i){ if (!Flag[i]) p[++tot] = i; ; j <= tot; ++j){ if ((k = i * p[j]) > N) break; Flag[k] = ; if (!(i % p[j])) break; } } } 为什么这是线性的呢? 因为程序…
题意: 克里斯蒂安·哥德巴赫曾经猜想,每个奇合数可以写成一个素数和一个平方的两倍之和 9 = 7 + 2×1215 = 7 + 2×2221 = 3 + 2×3225 = 7 + 2×3227 = 19 + 2×2233 = 31 + 2×12 最终这个猜想被推翻了. 最小的不能写成一个素数和一个平方的两倍之和的奇合数是多少? 思路:用线性筛法记录下来所有素数,然后去生成在范围内的哥德巴赫数字即可 /************************************************…
Problem:找出小于等于n的所有素数的个数. #include <bits/stdc++.h> using namespace std; const int maxn = 1e6; int prime[maxn]; // 欧拉线性素数筛,O(n) bool vis[maxn]; // 标记 int Prime(int n) { memset(vis,false,sizeof(vis)); int cnt = 0; vis[0] = vis[1] = true; for(int i = 2;…
Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices. — It is a matter of security to change such things every now…
埃拉托斯特尼筛法(sieve of Eratosthenes ) 是古希腊数学家埃拉托斯特尼发明的计算素数的方法.对于求解不大于n的所有素数,我们先找出sqrt(n)内的所有素数p1到pk,其中k = sqrt(n),依次剔除Pi的倍数,剩下的所有数都是素数. 具体操作如上述 图片所示. C++实现 #include<iostream> #include<vector> using namespace std; int main() { int n; cin >> n;…
1675 大质数 2  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 小明因为没做作业而被数学老师罚站,之后数学老师要他回家把第n个质数找出来. 小明于是交给聪明的你.请你帮忙![wikioi-1530] …………………………以上为背景………………………… 老师怀疑小明仅仅是找到第n个质数,于是又叫小明把1到n以内(不包括n)的质数全部找出来.小明又找到了你…… 输入描述 Input Des…
Help Hanzo 题意:求a~b间素数个数(1 ≤ a ≤ b < 231, b - a ≤ 100000).     (全题在文末) 题解: a~b枚举必定TLE,普通打表MLE,真是头疼.. b - a ≤ 100000 是关键. 类似素数筛的方法: 1.初始化vis[]=0 ; 2.素数的倍数vis[]=1; 3.  b较小时,素数筛解决   b很大时,素数筛的vis[]会MLE,此时用vis2[i-a]保存vis[i]就不会MLE 了.. #include<iostream>…
素数筛 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define MAXN 47000 #define inf 100000000 bool z[MAXN]; int x[MAXN]; ]; ]; int main() { int a,b; ;i<=;i++) //可以从小的素数开始筛 { if(!z[i]) for(int j=i*i;j<MA…
abs 题意: 问题描述 给定一个数x,求正整数y,使得满足以下条件: 1.y-x的绝对值最小 2.y的质因数分解式中每个质因数均恰好出现2次. 输入描述 第一行输入一个整数T 每组数据有一行,一个整数x 输出描述 对于每组数据,输出一行y-x的最小绝对值 输入样例 5 1112 4290 8716 9957 9095 输出样例 23 65 67 244 70 题解: 由于y质因数分解式中每个质因数均出现2次,那么y是一个完全平方数,设y=z*z,题目可转换成求z,使得每个质因数出现1次. 我们…
这题就是先写个素数筛,存到prime里,之后遍历就好,取余,看是否等于0,如果等于0就更新,感觉自己说的不明白,引用下别人的话吧: 素数打表,找出20000之前的所有素数,存入prime数组,对于每个输入的数a,从prime数组最后一个数往前判断,如果a % prime[当前序号]== 0,那么将该素数就是输入数据a的最大素因子,找出所有输入数据的最大素因子,找出最大的那个对应的数据a即可,当a == 1的时候要特别处理. 然而我现在还是不懂,为什么输入是1 1的时候输出1,题目也没说啊,还有最…
题目链接:http://codeforces.com/problemset/problem/449/C 给你n个数,从1到n.然后从这些数中挑选出不互质的数对最多有多少对. 先是素数筛,显然2的倍数的个数是最多的,所以最后处理.然后处理3,5,7,11...的倍数的数,之前已经挑过的就不能再选了.要是一个素数p的倍数个数是奇数,就把2*p给2 的倍数.这样可以满足p倍数搭配的对数是最优的.最后处理2的倍数就行了. #include <bits/stdc++.h> using namespace…
题目链接:http://lightoj.com/volume_showproblem.php?problem=1197 给你a和b求a到b之间的素数个数. 先在小区间素数筛,大区间就用类似素数筛的想法,把a到b之间不是素数的标记出来.因为b-a最多1e5的大小,所以每组数据的时间复杂度最多就o(1e5 log1e5). #include <iostream> #include <cstdio> #include <cstring> using namespace std…
折腾了一晚上很水的数论,整个人都萌萌哒 主要看了欧拉筛和素数筛的O(n)的算法 这个比那个一长串英文名的算法的优势在于没有多次计算一个数,也就是说一个数只筛了一次,主要是在%==0之后跳出实现的,具体的解释看的迷迷糊糊,特别是欧拉函数的求解 http://blog.csdn.net/lerenceray/article/details/12420725 代码如下 void ES(){ ;i<n;i++){ if (!pd[i]){ prime[++top]=i; phi[i]=i-; } ;j<…
Fermat's Chirstmas Theorem Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 In a letter dated December 25, 1640; the great mathematician Pierre de Fermat wrote to Marin Mersenne that he just proved that an odd prime p is expressible as p…
题意:有N个数,Alice 和 Bob 轮流对这些数进行操作,若一个数 n=a*b且a>1,b>1,可以将该数变成 a 和 b 两个数: 或者可以减少为a或b,Alice先,问谁能赢 思路:首先单看对每个数进行除法的操作,我们可以知道其实是在除以每个数的素因子或素因子之间的积 比如 70=2*5*7 我们可以变成 10(2*5)或 14(2*7) 或 35(5*7)或 2 或 5 或 7 或 1 这七种状态 当我们把他们(2,5,7)当作3个石子也就是一堆时,然而实际上我们是将这堆石子进行ni…
Some positive integers can be represented by a sum of one or more consecutive prime numbers. How many such representations does a given positive integer have? For example, the integer 53 has two representations 5 + 7 + 11 + 13 + 17 and 53. The intege…
题目链接 题意:对2~n+1染色,一个数不能与其素因子同色. 故而只需两种颜色即可,素数染1,合数染2便可满足条件 #include<bits/stdc++.h> using namespace std; typedef long long LL; //素数筛打表 ; ],num_prime=; ]; void init() { isNotPrime[]=isNotPrime[]=; ; i<=N; i++) { if(!isNotPrime[i]) prime[num_prime++]…
/* * 二次筛素数 * POJ268----Prime Distance(数论,素数筛) */ #include<cstdio> #include<vector> using namespace std; const int maxn = 1000005; typedef long long LL; bool is_prime_small[maxn]; bool is_prime[maxn]; vector <int> res; int main() { LL l,u…
385C - Bear and Prime Numbers 思路:记录数组中1-1e7中每个数出现的次数,然后用素数筛看哪些能被素数整除,并加到记录该素数的数组中,然后1-1e7求一遍前缀和. 代码: #include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset((a),(b),sizeof(a)) const int INF=0x3f…
原题链接 写个素数筛暴力打表一波就AC了: #include <iostream> using namespace std; const int N = 10001; int i, j, NotPrime[N]; long long sum[N]; void GetNotPrime() { for( i=2; i<=N; i++ ) if( !NotPrime[i] ) for( j = i+i; j<=N; j+=i ) NotPrime[j] = 1; } int k; voi…
这题有两种解法,1是根据欧拉函数性质:素数的欧拉函数值=素数-1(可根据欧拉定义看出)欧拉函数定义:小于x且与x互质的数的个数 #include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iom…
Xiaoming has just come up with a new way for encryption, by calculating the key from a publicly viewable number in the following way: Let the public key N = A B, where 1 <= A, B <= 1000000, and a 0, a 1, a 2, …, a k-1 be the factors of N, then the p…
题目链接: C. Primes or Palindromes? time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Rikhail Mubinchik believes that the current definition of prime numbers is obsolete as they are too complex…
题目链接: A. Mashmokh and Numbers time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output It's holiday. Mashmokh and his boss, Bimokh, are playing a game invented by Mashmokh. In this game Mashmokh wri…