素数

PAT 1007 素数对猜想 (20分)

南楼画角 提交于 2020-02-16 14:36:43
题目描述: 让我们定义d​n​​ 为:d​n​​=p​n+1−pn,其中p​i是第i个素数。显然有d1​​ =1,且对于n>1有dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N(<10​5​​ ),请计算不超过N的满足猜想的素数对的个数。 输入格式: 输入在一行给出正整数N。 输出格式: 在一行中输出不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 题意简化: 找素数对,若两个素数之和相差为2,则这两个数为一对素数对。 菜鸡版本: 思路:先将给定数以内的所有素数求出,分别放在数组中,再判断是否存在素数对。 # include <iostream> using namespace std ; int main ( ) { int num ; int k = 1 ; cin >> num ; int arr [ 10000 ] ; arr [ 0 ] = 1 ; int flag = 1 ; for ( int i = 2 ; i <= num ; i ++ ) { flag = 1 ; for ( int j = 2 ; j * j <= i ; j ++ ) { if ( ( i % j == 0 ) && ( i != j ) ) { flag = 0 ; break ; } } if ( flag == 1 ) {

PAT 1007 素数对猜想

这一生的挚爱 提交于 2020-02-16 13:50:17
PAT 1007 素数对猜想 题目: 让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数 N (<105),请计算不超过 N 的满足猜想的素数对的个数。 输入格式: 输入在一行给出正整数 N 。 输出格式: 在一行中输出不超过 N 的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 代码: #include <iostream> #include <vector> #include <cmath> using namespace std; #include <iostream> #include <vector> #include <cmath> using namespace std; bool is_prime( unsigned long long num ) { //两个较小数另外处理 if(num ==2|| num==3 ) return true ; //不在6的倍数两侧的一定不是质数 if(num %6!= 1&&num %6!= 5) return false ; unsigned long long tmp =sqrt( num); //在6的倍数两侧的也可能不是质数 for(int i= 5;i <=tmp; i+=6 )

判断一个数是不是素数的函数--C语言

随声附和 提交于 2020-02-14 23:41:36
判断一个数是不是素数的函数 #include "stdafx.h" int fun(int x) { int i,flag=0; for(i=2;i<x;i++) { if(x%i==0) { flag=1; } } if(flag==0) { printf("%d是素数\n",x); } else { printf("%d不是素数\n",x); } return x; } int main() { int x; scanf("%d",&x); fun(x); } 来源: CSDN 作者: 晴飔. 链接: https://blog.csdn.net/weixin_45661800/article/details/104320137

素数判定的三种方法(cpp代码)

假如想象 提交于 2020-02-13 12:15:23
文章目录 一般方法 埃拉托斯特尼筛法(埃氏筛) 线性筛 一般方法 原理概述: 1不是质数也不是合数,特殊处理; 从2枚举到 √x,若有能除尽的数直接返回x不是素数 Q:为什么枚举到√x? 若m整除n(其中n>根号m)则m=n*k。 若m不整除从1除到√m的数它就不可能整除根号m后面的数。 如果根号m有小于√m的因子X,那么N必定有大于√m的因子Y与X对应。 而且X *Y=m (来源:百度) 实现说明: 略 bool isPrime_usual ( int x ) { if ( x == 1 ) return false ; for ( int i = 2 ; i * i <= x ; i ++ ) if ( x % i == 0 ) return false ; return true ; } 埃拉托斯特尼筛法(埃氏筛) 原理概述: 从最小的素数2开始,2…3…5…将这些数的倍数标为合数。 实现说明: 首先要有一个数组vis,用来标记那些数是素数,所得结果也存在这个数组,并都初始化为true(即默认所有数都是素数) 从2开始枚举,若vis[i]==true,则用一个循环去将vis[i]的倍数都标记为非素数。个人感受j从i * i开始好一些,有一些从j=2*i开始会降低效率(重复筛)。 bool vis [ Maxn ] ; void isPrinme_era ( ) {

1116 Come on! Let's C (20分)

若如初见. 提交于 2020-02-12 21:13:16
题目链接: 1116 Come on! Let’s C (20分) 题意 prime Number 素数,给定N个人的Id按照排名依次给出,给出k次查询,求该id获得什么奖励。第一输出 Mystery Award ,素数名次输出Minion,其他输出Chocolate,第二次被询问则输出Checked,没有该ID则输出Are you kidding? 分析 数据范围为10000,所以可以使用桶,设置10000个桶,输入时id对应的桶的值为名次。 然后在设置个记录数组book,用来记录是否被输出过,初始为0,输入过id的对应的桶为1,被查询过为2. 判断10000以内的素数。 列写条件判断输出。 代码 # include <iostream> # include <cstdio> # include <cstring> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std ; const int maxn = 10001 ; /** prime number 素数 */ int a [ maxn ] = { 0 } , book [ maxn ] = { 0 } ; int prime [ maxn

1007 素数对猜想 (20分)

白昼怎懂夜的黑 提交于 2020-02-11 15:39:26
#include <stdio.h> #include<math.h> int isprime(int a); int main() { int i,j=0,a[100000],count=0; long n; scanf("%ld",&n); for(i=1;i<=n;i++) { if(isprime(i)==1) { a[j]=i; j++; } } for(i=0;i<j;i++) { if(a[i+1]-a[i]==2) { count++; } } printf("%d\n",count); return 0; } int isprime(int a) { int i,bz=0; for(i=2;i<=sqrt(a);i++)//求开方前的约数,减少计算量 { if(a%i==0) { bz=1; break; } } if(bz==0&&a!=1) return 1; else return 0; } 来源: https://www.cnblogs.com/cy846586184/p/12295086.html

约数——反素数

时间秒杀一切 提交于 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

Hash哈希(一)

眉间皱痕 提交于 2020-02-10 07:26:01
Hash哈希(一)    哈希是大家比较常见一个词语,在编程中也经常用到,但是大多数人都是知其然而不知其所以然,再加上这几天想写一个一致性哈希算法,突然想想对哈希也不是很清楚,所以,抽点时间总结下Hash知识。本文参考了很多博文,感谢大家的无私分享。 基本概念    Hash,一般翻译做“散列”,也有直接音译为“哈希”的。那么哈希函数的是什么样的?大概就是 value = hash(key),我们希望key和value之间是唯一的映射关系。   大家使用的最多的就是哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构,通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做哈希函数或散列函数。    实际中的Hash主要有两种应用:加密和压缩。 在加密方面,Hash哈希是把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值,最广泛应用的Hash算法有MD4、MD5、SHA1。 在压缩方面,Hash 哈希 是指把一个大范围映射到一个小范围,往往是为了节省空间,使得数据容易保存。 Hash的特点    主要原理就是把大范围映射到小范围,因此输入范围必须和小范围相当或者比它更小,否则增加冲突。   Hash函数逼近单向函数,所以可以用来对数据进行加密。(单项函数:如果某个函数在给定输入的时候

[LOJ143]质数判定(Miller-rabin素数测试+防相乘爆long long的技巧讲解)

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-09 20:47:14
题面 https://loj.ac/problem/143 题解 Miller-rabin素数测试 是一种随机化算法,能够在较短的时间内判断出一个数是合数,还是很可能为素数。其出错的概率极小;当用于测试的p取遍前10个素数时,在 \(3e18\) 的范围内不会出错。 原理:1、费马小定理 p为素数的必要不充分条件是 \(\forall (a,p)=1,a^{p-1}{\equiv}1{\mod p}\) 。证明不再赘述,可以参见百度百科或《数学奥林匹克命题人讲座:初等数论》2.3节。 2、二次探测 只使用费马小定理时,出错概率仍然较大,尤其是对于Carmichael数n(在 \(1e8\) 以下有255个,最著名的、最小的Carmichael数是561),对于所有的与n互质的正整数a,都可以满足 \(a^{n-1}{\equiv}1{\mod n}\) 。因此,仅仅使用Fermat测试是不够的。 二次探测的原理是:如果 \(x^2{\equiv}1{\mod p}\) ,p为素数,那么有 \(x{\equiv}{\pm}1{\mod p}\) 。证明显然,将1移项至左边,然后因式分解即可。 具体做法 设待测数为mod,若mod为偶数则可以直接判断。否则,我们将mod-1分解为 \(2^t*n\) ,其中 \(2{\nmid}n\) 。然后,取与mod互质的数p,计算 \[p^n、

数论初步

泪湿孤枕 提交于 2020-02-09 12:39:08
PS:以下部分定理没有证明,如果有读者想要了解定理的具体证明,请自行百度,本文限于篇幅 (只是因为笔者自己不会) ,对部分定理的证明不作讨论。 本文讲啥 本文主要讲的是ACM中的数论基础内容 (以后可能会再写一篇ACM的数论进阶内容) ,侧重应用,证明都是瞎证的,严谨的证明请观众姥爷自行百度 线性筛筛素数 埃氏筛 埃氏筛用每个素数来筛掉它的倍数,剩下的就是素数,时间复杂度是 \(O(nloglogn)\) 为啥能正确地筛? 每一个合数,都可以被质因数分解,且根据 唯一分解定理 ,这个分解是唯一的,所以只要拿每个素数把它的倍数都筛掉,就能所有合数筛掉 板子 bool check[maxn]; std::vector<ll> prime; for (ll i = 2; i <= n; ++i) if (!check[i]) { prime.push_back(i); for (ll j = i * i; j <= n; j += i) check[j] = 1; } 为啥 \(j\) 从 \(i^2\) 开始? 上面的板子中第二层循环就是用素数筛掉它的倍数的过程, \(j\) 从 \(2i\) 开始循环,那为什么板子里是从 \(i^2\) 开始呢?实际上,这是一个小小的优化,因为在用素数 \(i\) 来筛它的倍数时,区间 \([2, i-1]\) 中的所有素数已经将它的倍数都筛过了