素数

【筛法求素数】HDU-1239 Calling Extraterrestrial Intelligence Again

夙愿已清 提交于 2019-11-28 16:15:58
注解 1、首先用筛法求100000以内的素数,并找到其个数。 2、在所有找到的素数中,遍历找一个素数对,满足: (1)二者相乘小于等于m; (2)二者相乘是所有满足条件的素数对中的最大的; (3)二者相除大于等于a/b,并且小于等于1 代码 #include <iostream> #include <cstring> using namespace std; const int maxn = 100000; const int len = 9593; int prime[len]; void sieve() { int a[maxn]; int k=0; memset(a, 0, sizeof(a)); for(int i=2; i<maxn; i++) { if(!a[i]) { prime[k++] = i; for(int j=i+i; j<maxn; j+=i) { a[j] = 1; } } } } int main() { sieve(); int m, a, b; cin>>m>>a>>b; while(m || a || b) { int maxnow = -1; int ansa = -1; int ansb = -1; for(int i=0; i<len; i++) { if(prime[i]>m) { break; } for(int j=i; j<len;

1059 C语言竞赛 (20 分)

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-28 10:52:24
题目: 1059 C语言竞赛 (20 分) C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽: 0、冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。 1、排名为素数的学生将赢得最好的奖品 —— 小黄人玩偶! 2、其他人将得到巧克力。 给定比赛的最终排名以及一系列参赛者的 ID,你要给出这些参赛者应该获得的奖品。 输入格式: 输入第一行给出一个正整数 N( ≤),是参赛者人数。随后 N 行给出最终排名,每行按排名顺序给出一位参赛者的 ID(4 位数字组成)。接下来给出一个正整数 K 以及 K 个需要查询的 ID。 输出格式: 对每个要查询的 ID,在一行中输出 ID: 奖品 ,其中奖品或者是 Mystery Award (神秘大奖)、或者是 Minion (小黄人)、或者是 Chocolate (巧克力)。如果所查 ID 根本不在排名里,打印 Are you kidding? (耍我呢?)。如果该 ID 已经查过了(即奖品已经领过了),打印 ID: Checked (不能多吃多占)。 输入样例: 6 1111 6666 8888 1234 5555 0001 6 8888 0001 1111 2222 8888 2222 输出样例: 8888: Minion 0001: Chocolate 1111:

PAT Basic 1013 数素数 (20 分)

送分小仙女□ 提交于 2019-11-28 06:41:39
令 P ​ i ​​ 表示第 i 个素数。现任给两个正整数 M ≤ N ≤ 1 0 ​ 4 ​​,请输出 P ​ M ​​ 到 P ​ N ​​ 的所有素数。 输入格式: 输入在一行中给出 M 和 N,其间以空格分隔。 输出格式: 输出从 P ​ M ​​ 到 P ​ N ​​ 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。 输入样例: 5 27 输出样例: 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 #include <iostream> #include <cmath> #include <vector> using namespace std; bool isPrime(int n){ if(n==2||n==3) return true; for(int i=2;i<=sqrt(n);i++){ if(n%i==0)return false; } return true; } int main() { int a,b,p=0,var=0; cin>>a>>b; vector<int> vec; for(int i=2;p!=b;i++){ if(isPrime(i)){ vec.push_back(i); p++; } } for(int i=a

约数大合集(超详细!!!)

假如想象 提交于 2019-11-28 04:15:25
整数惟一分解定理的推论 1、求N的正约数集合 因为约数总是成对出现的(除了完全平方数)。因此只需扫描1~sqrt(N)之间的数就能得到N的正约数集合。 2、求1~N的每个数的正约数集合 3、约数个数 算术基本定理中,根据拆分后的素因子的指数,我们可以求出每个 N 的约数的个数。 根据这个式子,我们可以用 线性筛 去筛出当前 1~N 的约数个数。筛的过程中,我们需要保存下 最小素因子的个数 。 下面推导中 d(i) 表示 i 的约数个数 num[i] 表示 i 的最小素因子的个数 prim[i] 表示 第 i 个素数 ① 当前数N是素数 这种情况我们很容易得到,当前的 d(N) = (1+1) = 2 , 因为素数只有一个素因子(就是它本身),并且指数为 1 。 而最小素因子个数 num[N] = 1 ② i%prim[j] !=0 这种情况,i 当中,并不包含 prim[j] 这个素因子,然而,i*prim[j] 中, 包含了一个 prim[j]我们可以从前面得到 i 的所有约数个数 然后在补上 当前多了 素因子 prim[j] 的个数所以最后 d(i*prim[j]) = d(i)*d(prim[j]) 而且由于 当前的 prim[j] 必然是 i*prim[j] 的最小素因子 (因为从小到大枚举啊!), 我们要记录下这个最小素因子的个数所以保存一个个数 num[i*prim[j

1625: 【例 1】反素数 Antiprime

橙三吉。 提交于 2019-11-28 02:50:36
1625: 【例 1】反素数 Antiprime 【题目描述】 原题来自:POI 2001 如果一个大于等于 1 的正整数 n ,满足所有小于 n 且大于等于 1 的所有正整数的约数个数都小于 n 的约数个数,则 n 是一个反素数。譬如: 1 , 2 , 4 , 6 , 12 , 24 ,它们都是反素数。 请你计算不大于 n 的最大反素数。 【输入】 一行一个正整数 n 。 【输出】 只包含一个整数,即不大于 n 的最大反素数。 【输入样例】 1000 【输出样例】 840 【提示】 数据范围与提示: 对于 10% 的数据, 1 ≤ n ≤ 10 3 ; 对于 40% 的数据, 1 ≤ n ≤ 10 6 ; 对于 100% 的数据, 1 ≤ n ≤ 2 × 10 9 。 这道题是一本通的例题,虽然代码很短但是注释过于简单不变理解,洛谷大佬的题解太长又不想看。。 #include<bits/stdc++.h> using namespace std; #define ll long long int a[20]={0,2,3,5,7,11,13,17,19,23,29}; ll n,s,s1; void dfs(ll x,ll y,ll b,ll z) { if(x==11) return ; ll i,k=1; for(i=1;i<=b;i++) { k*=a[x]; if(y*k

梅森数

时间秒杀一切 提交于 2019-11-28 01:36:44
形如 2 ​ n ​​ − 1的素数称为梅森数(Mersenne Number)。例如 2 ​ 2 ​​ − 1 = 3、 2 ​ 3 ​​ − 1 = 7都是梅森数。1722年,双目失明的瑞士数学大师欧拉证明了 1是一个素数,堪称当时世界上“已知最大素数”的一个记录。 本题要求编写程序,对任一正整数 n( 0),输出所有不超过 2 ​ n ​​ − 1的梅森数。 输入格式: 输入在一行中给出正整数 n( 0)。 输出格式: 按从小到大的顺序输出所有不超过 2 ​ n ​​ − 1的梅森数,每行一个。如果完全没有,则输出“None”。 输入样例: 6 输出样例: 3 7 31 1 #include<stdio.h> 2 int main() 3 { 4 int ncf(int n); 5 int i,j,n,sum,pd,jishu;//定义判断变量 6 jishu=0;//初始化计数值等于0 7 scanf("%d",&n);//输入n<20的数 8 for(i=1;i<=n;i++)//开始循环,共运行n次,注意:因为n次方从1开始,所以i从1开始 9 { 10 pd=1;//判断=1 11 sum=ncf(i);//计算2^n-1的值; 12 for(j=2;j<sum;j++) 13 { 14 if(sum%j==0)//能除尽则不是素数 15 { 16 pd=0;/

素数筛(埃氏筛+欧拉筛)

吃可爱长大的小学妹 提交于 2019-11-28 01:17:00
素数筛 顾名思义,用来筛选素数。 这里介绍两种素数筛: 1.埃氏筛(埃拉托斯特尼筛法) 1 void ass() 2 { 3 memset(u,true,sizeof(u));//u[i]=true表示i是素数 4 for(int i=2; i<=1100000; i++) 5 { 6 if(u[i]) 7 for(int j=2; j<=1100000; j++) 8 { 9 if(i*j>1100000) break; 10 u[i*j]=false;//素数×j(j>=2)一定是合数 11 } 12 } 13 } 2.欧拉筛 1 void olas()//su[]用来存素数的值 2 { 3 int i,j; 4 num=1;//num记录素数个数 5 memset(u,true,sizeof(u));//u[i]=true表示i是素数 6 for(int i=2;i<=1000000;i++) 7 { 8 if(u[i]) su[num++]=i; 9 for(int j=1;j<num;j++) 10 { 11 if(i*su[j]>1000000) break;//超出判定的范围 12 u[i*su[j]]=false;//因为素数×i(i>=2)一定是合数。 13 if(i%su[j]==0) break;//这个是欧拉筛减少时间开销的关键 14      } 15 }

宇宙

江枫思渺然 提交于 2019-11-27 22:50:46
前两天在看素数的相关资料,发现这个还真个密一样的东西。。 素数的分布现在还是个密,现目前只有通过简单的判断的方式进行递归式的查找 想想也是这样的,现在的数据的算术计算都是积累在乘除法上面的,比如说指数呀,微积分呀一大堆,如果离开了乘除法,然并卵。。 出现了素数这种乘除法的死角的情况,我们现在确一直在乘除法上面突破,额,想想都难。 本人认为突破这个问题,应该是承认如今算术上乘除法的缺点,寻找新的算术法则。。。 我能力有限这个问题只是吱吱声。。。 现在还有个问题,就是宇宙空间的问题,感觉也是很纠结的,为啥大佬们都在想把时间加在公式上,相对定律用得飞起,但是并没有发现新空间,还迎来很多不可解决的问题。。 这就将宇宙这些定义为未知之谜。。 为什么就不换一个角度看问题,走不通的死胡同,偏偏要去凿出一条通路,这不是很难吗,后人还叫它歪门邪道。。 当想着上面的素数的问题,我我突然想起一个问题,那就是我们的空间是三维的,我们目前发现了的,在三维空间,我们很好建模什么的。碰巧发现质数2 3 5... 的序列 我的猜想是,下一个有效基数应该是五维或者更高,而不是按照常规的四维。。。 至于三维为什么突然就添加了两维空间,我感觉这是这是三维空间的一个基础,我感觉这两维可能是能量和物质。。。 又或者现在我们三维空间本来定义就有误,我感觉三维有点牵强,我们人类的感官有很大的可能蒙蔽了事物的真实是发展。。

PAT Basic 1013 数素数 (20 分)

a 夏天 提交于 2019-11-27 18:24:59
令 P ​ i ​​ 表示第 i 个素数。现任给两个正整数 M ≤ N ≤ 1 0 ​ 4 ​​,请输出 P ​ M ​​ 到 P ​ N ​​ 的所有素数。 输入格式: 输入在一行中给出 M 和 N,其间以空格分隔。 输出格式: 输出从 P ​ M ​​ 到 P ​ N ​​ 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。 输入样例: 5 27 输出样例: 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 #include <iostream> #include <cmath> #include <vector> using namespace std; bool isPrime(int n){ if(n==2||n==3) return true; for(int i=2;i<=sqrt(n);i++){ if(n%i==0) return false; } return true; } int main(){ int l,r,res=0,br=0; cin>>l>>r; for(int i=2;res<=r;i++){ if(isPrime(i)){ res++; if(res>=l&&res<=r){ cout<<i;br++; if(br%10==0