最大素数

素数线性筛优化

时光总嘲笑我的痴心妄想 提交于 2020-04-04 06:26:16
大致思路:   初始时,令2是素数,假设2之后奇数全部数都是素数(偶数不考虑会快一点点),从3开始每当找到一个素数时,显然这个素数乘上另外一个数之后都是合数,把这些合数都筛掉,直到最后一个奇数超出范围,剩下的都是奇数都是素数。   注:以下代码只为得到n以内的素数,所以执行后标记数组中的标记是不完整的,如函数1和2中的isPrime[4]=1显然是错的,不过这对prime数组没有影响。如果想使标记数组完整,请自行修改。 前提: 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int MN=1e+8; 5 bool isPrime[MN];//isPrime[i]:i是否素数 6 int prime[MN/10];//prime[i]:第i个素数 1.普通筛法: 1 int makePrime1(int n)//求n以内的素数,返回得到的素数个数,下同 2 { 3 memset(isPrime,1,sizeof(isPrime)); 4 memset(prime,0,sizeof(prime)); 5 // 6 prime[1]=2; 7 int cnt=1; 8 for(long long i=3;i<=n;i+=2) 9 { 10 if(isPrime[i]) 11 { 12 prime[++cnt]=i;

SCAU 8614 素数

孤街浪徒 提交于 2020-03-26 12:40:36
8614 素数 时间限制:500MS 内存限制:1000K 提交次数:0 通过次数:0 题型: 编程题 语言: 无限制 Description 数学对于计算机学是很重要的,大一的高数就曾经(或即将)令一批又一批人饮恨。这里就是一个数学问题,当然,它不需要用到高深的高数知识。 给出n(1<=n<=100000),问1到n之间有几个素数。 Input 第1行,1个整数T(T<=100000),表示共有T组测试数据 第2---第T+1行,每行1个整数,表示测试数据n Output 对于每个测试数据,输出1行,每行1个数,表示1到n之间的素数个数 Sample Input 5 1 2 100 1000 5000 Sample Output 0 1 25 168 669 Source 白衣人 Provider admin #include <stdio.h> #include <string.h> int prime[100001]; int cnt[100001]; int main() { int i,j,t; memset(prime,0,sizeof(prime)); memset(cnt,0,sizeof(cnt)); prime[0]=prime[1]=1; for(i=2;i<100000;i++) if(prime[i]==0){ for(j=i+i;j<100001;j+

《信息安全数学基础一》第一章笔记

被刻印的时光 ゝ 提交于 2020-03-26 03:15:25
《信息安全数学基础一》第一章笔记 目录 《信息安全数学基础一》第一章笔记 整除 素数,合数 素数判别 筛法 埃式筛 欧拉筛 进制转换 最大公因数与最小公倍数 欧几里得算法 贝祖等式 拓展欧几里得算法 算术基本定理 整除 定义 在整数域内,若 \(a = q\cdot b\) ,则 \(b\) 整除 \(a\) ,记作 \(a | b\) 性质 若 \(a | b,\ b | c\) ,则 \(a | c\) 若 \(c | a_{i},\ i = 1,\ 2,\ ..,\ n\) 则 \(c\) 也整除 \(a_{i}\) 的线性组合 素数,合数 素数定义 除了 \(1\) 和自身外,没有因数的数,称之为素数,也称为质数,其他数被称为合数。 \(2\) 是最小的素数 素数判别 一个定理 对于合数 \(n\) ,必然存在不超过 \(\sqrt{n}\) 的质因子。 设 \(n = pq\) ,设 \(p\) 是最小因子,则 \(p\leq q\) 则 \(n = pq \geq p^{2}\) 所以 \(p\leq \sqrt{n}\) 假设 \(p\) 是合数,则可以继续进行分解,与题设不符,所以 \(p\) 是质数。 定理推论 对于一个数 \(n\) ,若其不存在不超过 \(\sqrt{n}\) 的质因子,那么其为素数。 素数平凡判别 枚举 \(2-\sqrt{n}\) 内的素数

约数——反素数

时间秒杀一切 提交于 2020-02-10 15:13:22
反素数 对于任何正整数x,其约数的个数记作g(x),例如g(1)=1、g(6)=4。 如果某个正整数x满足:对于任意的小于x的正整数 i,都有g(x)>g(i) ,则称x为反素数。 例如,整数1,2,4,6等都是反素数。 现在给定一个数N,请求出不超过N的最大的反素数。 输入格式 一个正整数N。 输出格式 一个整数,表示不超过N的最大反素数。 数据范围 1 ≤ N ≤ 2 ∗ 1 0 9 1≤N≤2∗10^9 1 ≤ N ≤ 2 ∗ 1 0 9 输入样例: 1000 输出样例: 840 题解: 我们推的反素数其实一个1-n中含有最多约数,并且这个数最小的数字。 假设这个数为x,我们画一个数轴来看,因为要任意的小于x的正整数 i,所以x点右边的数不考虑。再看左边的数,约数个数都是小于等于f(x)但是都是小于x的。 这里有几个性质: 1, 2 ∗ 1 0 9 2*10^9 2 ∗ 1 0 9 中约数个数最多的数一共有1600个约数。 2, 2 30 > 2 ∗ 1 0 9 2^{30}>2*10^9 2 3 0 > 2 ∗ 1 0 9 3,利用中国四大定理可以知道。我们分解质因子再看看题目范围最多用到9个质因子就会超过范围了。 4,我们分解质因子的时候我们的因子指数是递减的。 所以综上,我们可以使用爆搜来处理问题。 # include <bits/stdc++.h> using

找素数(一些数任意组合,DFS)

回眸只為那壹抹淺笑 提交于 2020-02-01 09:22:53
素数又称质数,是指一个大于 1 的正整数,如果除了 1 和它本身以外,不能再被其它的数整除, 例如:2、3、5、97 等都是素数。2 是最小的素数。 现在,给你 n 个数字,请你从中选取一部分,用它们拼出一个最大的素数。 注意:某个数字出现多少次你就可以用多少次,6 与 9 不能混用。 样例 输入 3 2 7 9 样例输出 97 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 100000 + 5; 4 int vis[50]; 5 bool prime[N];//prime[i]表示i是不是质数 6 int p[N], tot;//p[N]用来存质数 7 int n,a[10]; 8 9 void init(){ 10 for(int i = 2; i < N; i ++) prime[i] = true;//初始化为质数 11 for(int i = 2; i < N; i++){ 12 if(prime[i]) p[tot ++] = i;//把质数存起来 13 for(int j = 0; j < tot && i * p[j] < N; j++){ 14 prime[i * p[j]] = false; 15 if(i % p[j] == 0) break;/

洛谷P1217 [USACO1.5]回文质数 Prime Palindromes (C语言 + 详细注释 + 多优化)

我的未来我决定 提交于 2020-01-29 10:12:34
//本题思路并不难想,如果区间内的数既是素数,也是回文数,那么就是回文素数,写两个函数判断素数和回文数即可。然鹅本题并不会让你那么轻松通过(毕竟难度是普及-呢),很有可能你过了样例,但是提交得到的结果是一片RE(超时),因为本题最大数据达到了一亿,一个个的遍历,必然会很浪费时间,所以需要一定的优化,把部分数据直接排除。具体优化如下: 1:偶数必然不是素数,所以偶数不用考虑; 2:由数论知识得:偶数位的回文数,除了11其他的都可以被11整除,必然不是素数,所以最大数据只需到10000000(一千万,10000000~100000000之间的数都是八位数,偶数,可直排除) (详见 https://www.zhihu.com/question/67646272 ) 3:用埃拉托色尼法筛选素数,节省时间(详见 https://blog.csdn.net/qq_45472866/article/details/104051475 ) 下面是我AC的代码: #include<stdio.h> void checkprime(int p); int prime[10000000]; //只需开到一千万(开到一亿的话,会超内存) int is_huiwen(int p); int main() { int a, b, left, right, i; //left为区间左端点,right为右端点

Python 输出指定范围内的素数

风流意气都作罢 提交于 2020-01-28 08:44:33
素数(prime number)又称质数,有无限个。除了1和它本身以外不再被其他的除数整除。 以下实例可以输出指定范围内的素数: #!/usr/bin/python3 # 输出指定范围内的素数 # take input from the user lower = int(input("输入区间最小值: ")) upper = int(input("输入区间最大值: ")) for num in range(lower,upper + 1): # 素数大于 1 if num > 1: for i in range(2,num): if (num % i) == 0: break else: print(num) 来源: CSDN 作者: qq_34412985 链接: https://blog.csdn.net/qq_34412985/article/details/103791563

ZJNU 1223 - 素数距离——高级

妖精的绣舞 提交于 2020-01-26 01:11:37
因为最大可以达到int极限 明显直接筛选不可能完成 所以从其因子入手 因为任何不是素数的数都有除了1与其自身之外的因子 因此,我们筛出2^(31/2)≈46350之内的所有素数,以其作为因子再将题目给定区间内的所有不是素数的数标记排除 然后将素数存放在prnum这个vector集合中便于调用 在排除阶段,可以用 l=((L+prnum[i]-1)/prnum[i])*prnum[i] 计算出区间内的第一个是prnum[i]的倍数的数 注意,如果计算出来的使其本身,取倍数 再用 r=R/prnum[i]*prnum[i] 计算出最后一个是prnum[i]的倍数的数 符合条件时,从l到r,每次加prnum[i],标记出所有以prnum[i]为因子的数 因为无法直接开数组标记到大数 但又因为R-L≤1000000 所以可以对位置进行转换 标记时取-L+1,取出时取-1+L 最后将区间内的素数取出放在ans这个vector集合内,对答案进行判断即可 (注意特殊情况的判断) 1 /* 2 Written By StelaYuri 3 */ 4 #include<bits/stdc++.h> 5 using namespace std; 6 typedef long long ll; 7 vector<ll> prnum,ans; 8 bool prim[46400],ar[1000010];

素数问题

安稳与你 提交于 2020-01-25 01:25:46
如何判断一个数是否为素数 暴力方法 判断一个数n是否为素数,只需在(1,n)看是否存在它的因子 bool IsPrime(int n) { if(n < 2) return false; else if(n == 2) return true; else{ for(int i = 2;i < n;++i) if(n % i == 0) return false; return true; } } 优化版1 定理 :如果n是合数,在 \((1,\sqrt{n}]\) 必定存在它的因子 证明:设 \(n=ab\) 假设a,b都小于 \(\sqrt{n}\) ,那么 \(ab<\sqrt{n}\sqrt{n}=n\) ,矛盾 假设a,b都大于 \(\sqrt{n}\) ,那么 \(ab>\sqrt{n}\sqrt{n}=n\) ,矛盾 因此我们可以得知,只需在 \((1,\sqrt{n}]\) 中看是否存在它的因子即可,再者可先判断n是否为偶数(2除外),不是偶数的话,只需在 \((1,\sqrt{n}]\) 中的奇数看是否存在它的因子即可 bool IsPrime(int n) { if(n < 2) return false; else if(n == 2) return true; else if(!(n&1))//n是偶数 return false; else { int num

LeetCode算法题-Prime Number of Set Bits in Binary Representation(Java实现)

久未见 提交于 2020-01-22 07:55:25
这是悦乐书的第 311 次更新,第 332 篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第180题(顺位题号是762)。给定两个正整数L和R,在[L,R]范围内,计算每个整数的二进制数中1的个数,判断1的个数是否是一个素数。例如,21的二进制数是10101,其中1的个数有3个,3是一个素数。例如: 输入:L = 6,R = 10 输出:4 说明: 6 --> 110(2个1,2是素数) 7 --> 111(3个1,3是素数) 9 --> 1001(2个1,2是素数) 10 --> 1010(2个1,2是素数) 输入:L = 10,R = 15 输出:5 说明: 10 --> 1010(2个1,2是素数) 11 --> 1011(3个1,3是素数) 12 --> 1100(2个1,2是素数) 13 --> 1101(3个1,3是素数) 14 --> 1110(3个1,3是素数) 15 --> 1111(4个1,4不是素数) 注意 : L,R是[1,10 ^ 6]范围内的整数,并且L小于等于R. R减L的差最多为10000。 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。 02 第一种解法 第一步,需要先计算出整数的二进制数中1的个数