素数

搜索入门练习题1 素数环 题解

匿名 (未验证) 提交于 2019-12-02 23:57:01
题目出处:《信息学奥赛一本通》例5.1。 素数环:从 \(1\) 到 \(n(2 \le n \le 20)\) 这 \(n\) 个数摆成一个环,要求相邻的两个数的和是一个素数。 输入包含一个整数 \(n(2 \le n \le 20)\) 。 按字典序从小到大的顺序输出所有排列方案,每个排列方案占一行。每行的 \(n\) 个数之间由一个空格分隔。 2 1 2 2 1 很明显,这是一道可以用搜索解决的问题,我们可以采用“回溯”思想,使用深度优先搜索解决这个问题。 我们用 ans[] 数组来存放我们当前遍历到的答案, ans[id] 用于表示当前排列的第 id 个数是什么。所以我们可以开一个函数 void f(int id) 来表示要在第 id 个位置放数,我只需要从 1 到 n 遍历每一个数(我这里假设是 i),并判断 i 是否能放。 在第 id 个位置能放 i 当且仅当: \(ans[1]\) 到 \(ans[id-1]\) 都不等于 \(i\) ,即 \(i\) 之前没有放过; 当 \(id \gt 1\) 时,满足 \(ans[id-1]+ans[id]\) 是素数; 当 \(id = n\) 时,满足 \(ans[1] + ans[n]\) 是素数。 这样,我们递归地调用 f(id) ,当 id>n 时就是我们递归的边界条件;一旦 id>n 就说明我找到了一种方案。

POJ--2689-C++

匿名 (未验证) 提交于 2019-12-02 23:51:01
题意很简单就是让你求给定区间的素数,然后用一个循环求出相距最远的相邻素数数和最近的素数以及相距最近的相邻素数 难点在与数据很大,所以不可能直接对区间的每一个数进行素数判断。但是,每个合数n都至少有一个因数在2到根号n(以此来筛去该合数),同时这其中U的最大值为2的31次方,对其开方得46000+,这个数据的大小在可接受范围内,所以可以用2到根号U之间的素数来筛去L到U区间的合数。 #include<iostream> #include<cstring> #include<utility> #include<cmath> #define N 1000000 #define M 50000 using namespace std; int primes[M]; bool judge[M]; bool p[N]; int b[N]; int cnt; void getPrimes(int n); int main() { } void getPrimes(int n)//用欧拉筛法筛出2到根号n里面的素数 { }

[Jobdu] 题目1016:火星A+B

匿名 (未验证) 提交于 2019-12-02 23:49:02
原文链接: http://www.cnblogs.com/easonliu/archive/2012/07/25/2608602.html 题目描述: 输入: 输出: 样例输入: 1,0 2,1 4,2,0 1,2,0 1 10,6,4,2,1 0 0 样例输出: 1,0,1 1,1,1,0 1,0,0,0,0,0 跟大数运算加法有点像,对于大数运算第一位都是10进制,在取值时,需要模10,在这里只要模上该位对应的素数就OK了。 先建一个30位的素数表,判断n是否素数时只需检查n是否能被1到sqrt(n)之间的素数整除,这些素数可以从表里取得。若n是素数则将其加到表里。 代码如下: #include <iostream> #include <vector> #include <sstream> #include <cmath> #include <algorithm> using namespace std; string A,B; int p[30]; vector<int> a,b,c; void init(){ p[0] = 2; p[1] = 3; p[2] = 5; int c = 3; for(int i=6;c<30;i++){ bool flag = true; for(int j=0;p[j]<=sqrt(i)+1;j++){ if(i%p[j]==0){

欧拉函数

匿名 (未验证) 提交于 2019-12-02 23:42:01
\(\varphi(x)\) 表示 \(x\) 以内与 \(x\) 互质的个数 \(\varphi(x)=x*\prod\limits_{i=1}^n(1-\dfrac{1}{p_i})\) \(p_i\) 为x的质因数 特殊的 \(\varphi(1)=1\) 其中 \(p_1,p_2……p_n\) Ϊ \(x\) 的所有质因数( \(x\) 是正整数) 那么,怎么理解这个公式呢? 对于 \(x\) 的一个质因数 \(p_i\) ,因为 \(x\) 以内 \(p_i\) 的倍数是均匀分布的,所以 \(x\) 以内有 \(\frac {1}{p_i}\) 的数是 \(p_i\) 的倍数 对应的,有 \(1-\dfrac {1}{p_i}\) 的数不是 \(p_i\) 同理,对于 \(p_j\) 有 \(1-\frac {1}{p_j}\) 的数不是 \(p_j\) 的倍数 所以有 \((1-\frac {1}{p_i})*(1-\frac {1}{p_j})\) 的数既不是 \(p_i\) 的倍数,又不是 \(p_j\) 的倍数 当有函数 \(f(x)\) , \(m\) 与 \(n\) 互质时, \(f(m)*f(n)=f(m*n)\) 称为积性函数 对任意整数 \(m\) 与 \(n\) , \(f(m)*f(n)=f(m*n)\) 称为完全积性函数 对于质数 \(p\) ,

输出100到200之间的素数;输出九九乘法表;输出1000到2000之间的闰年;

匿名 (未验证) 提交于 2019-12-02 23:40:02
1.输出100到200之间的素数。 #include<stdio.h> #include<stdlib.h> int main() { int i, j, n; for (i = 100; i <= 200; i++) { n = sqrt(i); for (j = 2; j <= n; j++) { if (i%j == 0) break; } if (j == i) printf("%d\n", i); } printf("\n"); system("pause"); return 0; } 2.输出九九乘法表。 #include<stdio.h> int main() { int i, j; for (i = 1; i <= 9; i++) { for (j = 1; j <= i; j++) { printf(" %d*%d=%d ", i, j, i*j); } printf("\n"); } system("pause"); return 0; } 3.输出1000到2000之间的闰年。 #include<stdio.h> #include<stdlib.h> int main() { int y; for (y = 1000; y <= 2000; y++) { if (y % 400 == 0) { printf("%d ", y); } else if (y %

算法笔记B1007.素数对猜想

匿名 (未验证) 提交于 2019-12-02 23:05:13
1007 素数对猜想 (20 分) 让我们定义d 为:d n n+1 ,其中p 1 n 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 5 ),请计算不超过N的满足猜想的素数对的个数。 输入格式: 输入在一行给出正整数N。 输出格式: 在一行中输出不超过N的满足猜想的素数对的个数。 输入样例: 20 输出样例: 4 CODE: # include <iostream> # include <math.h> using namespace std ; bool isPrime ( int n ) { for ( int i = 2 ; i * i <= n ; i ++ ) { if ( n % i == 0 ) return false ; } return true ; } int main ( ) { int n , num = 0 ; cin >> n ; for ( int i = 2 ; i + 2 <= n ; i ++ ) { if ( isPrime ( i ) && isPrime ( i + 2 ) ) num ++ ; } cout << num ; return 0 ; } 文章来源: https://blog.csdn.net/collins0001/article/details/88072366

素数筛选法

匿名 (未验证) 提交于 2019-12-02 23:05:13
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_43412506/article/details/86737669 素数的求解在很多题目当中都会用到,最常见的就是直接暴力判断 bool isprime(int number) { if(number==1) return 0; if(number==2) return 1; for(int i=2;i*i<=number;i++) { if(number%i==0) return 0; } return 1; } 但是这种方法是一种糟糕的方法,它的耗时是巨大的,所以我们需要寻找更好的方法来解决这个问题 我们知道,最大公约数只有1和它本身的数叫做素数,那么只要 剔除2 3 4 5 6...的倍数 ,得到的数就是素数 代码: const int maxn = 1e6+5; int p[maxn]; void isprime() { memset(p,0,sizeof(p)); for(int i = 2;i*i<maxn;i++) { if(p[i]==0) { for(int j = i*2;j<maxn;j+=i) p[j] = 1; } } } 除了剔除2,3,4,5,6..的倍数,还有两种方法筛选素数,具体参考 三种素数筛选法详解 相关知识: 1

判决素数个数(筛法)

匿名 (未验证) 提交于 2019-12-02 23:05:13
描述 输入两个整数X和Y,输出两者之间的素数个数(包括X和Y)。 输入 两个整数X和Y(1 <= X,Y <= 10的5次方)。 输出 输出一个整数,表示X,Y之间的素数个数(包括X和Y)。 样例输入 1 100 样例输出 25 看到这题,首先想到的是在从a到b逐个判断,累加;我们也可以用筛法高效的做出,运行速度比第一个快了不少。此题还需注意a,b没说谁大谁小,要有一步比较交换。用筛法时要注意数组要开大一些(至少超过数据范围),否者会出现runtime error; 第一个方法的代码如下: #include<iostream> #include<bits/stdc++.h> using namespace std; int main() { long long a,b,c=0,i,d,j; cin>>a>>b;if(a>b) swap(a,b); for(i=a;i<=b;i++) { d=0;if(i<=1) continue; for(j=2;j<=sqrt(i);j++) { if(i%j==0) {d=1;break;} } if(d==0) c++; } cout<<c; } 筛法如下: #include<iostream> #include<cstdio> #include<iomanip> #include<bits/stdc++.h> using namespace

快速判断一个数是否是素数(模板)

匿名 (未验证) 提交于 2019-12-02 22:56:40
判断一个数是否为质数/素数――从普通判断算法到高效判断算法思路 bool isPrime( int num ) { if(num ==2|| num==3 ) //两个较小数另外处理 return 1 ; if(num %6!= 1&&num %6!= 5) //不在6的倍数两侧的一定不是质数 return 0 ; int tmp =sqrt(num); for(int i= 5; i <=tmp; i+=6 ) //在6的倍数两侧的也可能不是质数 if(num %i== 0||num %(i+ 2)==0) //排除所有,剩余的是质数 return 0 ; return 1 ; } 首先看一个关于质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等; 证明:令x≥1,将大于等于5的自然数表示如下: ・・・・・・ 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ・・・・・・ 可以看到,不在6的倍数两侧,即6x两侧的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不是素数,再除去6x本身,显然,素数要出现只可能出现在6x的相邻两侧。这里有个题外话,关于孪生素数,有兴趣的道友可以再另行了解一下,由于与我们主题无关,暂且跳过。这里要注意的一点是

python3-filter

匿名 (未验证) 提交于 2019-12-02 22:56:40
Python内建的 filter() 函数用于过滤序列。 和 map() 类似, filter() 也接收一个函数和一个序列。和 map() 不同的是, filter() 把传入的函数依次作用于每个元素,然后根据返回值是 True 还是 False 决定保留还是丢弃该元素。 例如,在一个list中,删掉偶数,只保留奇数,可以这么写: def is_odd(n): return n % 2 == 1 list(filter(is_odd, [ 1, 2, 4, 5, 6, 9, 10, 15 ])) # 结果: [1, 5, 9, 15] 把一个序列中的空字符串删掉,可以这么写: def not_empty(s): return s and s.strip() list(filter(not_empty, [ ‘ A ‘ , ‘‘ , ‘ B ‘ , None, ‘ C ‘ , ‘ ‘ ])) # 结果: [‘A‘, ‘B‘, ‘C‘] 可见用 filter() 这个高阶函数,关键在于正确实现一个“筛选”函数。 注意到 filter() 函数返回的是一个 Iterator ,也就是一个惰性序列,所以要强迫 filter() 完成计算结果,需要用 list() 函数获得所有结果并返回list。 算 素数 的一个方法是 埃氏筛法 ,它的算法理解起来非常简单: 首先,列出从 2