判断素数

一个数由三个素数的和组成的方案数

懵懂的女人 提交于 2019-12-05 12:12:39
B: Prime Split 题解: 1、先判断两个素数w[i]、w[j]的和是否大于n-2,若小于则说明数字n不可能由三个素数组成(2是最小的素数) 2、再判断n-w[i]-w[j]是否是素数 3、保证w[i]、w[j]、n-w[i]-w[j]是递增的,避免重复计数 //注意laz[]要和线段树数组开一样大小 #include<iostream> #include<algorithm> #include<vector> #include<math.h> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxn = 40005; int prim[maxn], w[maxn], cnt = 0;//prim[i]起标记作用,prim[i]==0表示i是质数,注意这里把1也标记成了质数 int x[maxn];//x[i]表示偶数是i的符合条件的两个质数是x[i]和i-x[i]; void init() { memset(prim, false, sizeof(prim)); prim[1]=1;//1不是素数 for(int i = 2; i < maxn; i++) { if(prim[i]) //判断i是否为偶数 continue; w[cnt++]

Project Euler 60: Prime pair sets

大城市里の小女人 提交于 2019-12-04 20:17:22
素数3, 7, 109, 673很有意思,从中任取两个素数以任意顺序拼接起来形成的仍然是素数。例如,取出7和109,7109和1097都是素数。这四个素数的和是792,是具有这样性质的四个素数的最小的和。求满足以上性质的五个素数的最小的和。 分析:这道题的解法非常让人出人意料,这个问题实际上和图论中的的分团问题有关。要理解这个问题,我们需要知道一点图论中的基础知识。如果你已经对图论比较了解了,这一段可以跳过。图论属于组合数学的一个分支,图是图论的主要研究对象。所谓图是指由若干给定的顶点及连接两顶点的边所构成的图形,这种图形通常用来描述某些事物之间的关系。顶点用于代表事物,连接两顶点的边则用于表示两个事物间具有这种关系。图按其中的边是否有方向性可以分为有向图和无向图,按边是否有权重可以分为有权重图和无权重图,我们今天这里讨论的只是无权重的无向图,其它类型的图这里就不涉及了。 回到这里的问题,题目要求我们求出满足性质的五个素数的最小和,则我们首先需求找到这些满足性质的素数。这个性质即这些素数中两两之间可以正向和反向拼接仍能构成素数。我们可以把这些素数想像成为图中的节点,如果两个素数之间满足题目所说的性质,则我们可以在这两个素数之间画一条边。那么题目的问题就可以转换成,在一个由素数构成的图找到满足条件的五个顶点,这五个顶点两两之间都是联通的。现在我们可以明显看出来

8. 流程控制语句

泄露秘密 提交于 2019-12-04 13:59:16
1. 条件语句 Python程序语言指定 任何非0和非空(null)值 为 true , 0 或者 null 为 false 。 Python 编程中 if 语句用于控制程序的执行,基本形式为: if 判断条件: 执行语句…… else: 执行语句…… 其中"判断条件"成立时(非零),则执行后面的语句,而执行内容可以多行,以缩进来区分表示同一范围。 else 为可选语句,当需要在条件不成立时执行内容则可以执行相关语句。 #!/usr/bin/python # -*- coding: UTF-8 -*- # 例1:if 基本用法 flag = False name = 'luren' if name == 'python': # 判断变量是否为 python flag = True # 条件成立时设置标志为真 print 'welcome boss' # 并输出欢迎信息 else: print name # 条件不成立时输出变量名称 输出结果为: luren # 输出结果 1.1 当判断条件为多个值时,可以使用以下形式: if 判断条件1: 执行语句1…… elif 判断条件2: 执行语句2…… elif 判断条件3: 执行语句3…… else: 执行语句4…… #!/usr/bin/python # -*- coding: UTF-8 -*- # 例2:elif用法 num = 5

欧拉工程第四十一至五十题解题思路分析

时光总嘲笑我的痴心妄想 提交于 2019-12-03 23:13:56
四十一、全数字素数(pandigital prime) 当一个N位数的数字各个数位分别使用了1至N所有的数字,我们就说这是一个N位的全数字。例如,2143是一个四位的全数字,同时还是一个素数。求最大的同时为素数和N位全数字的数。 分析:小学的时候我们都已经学过,当一个数字的所有数位之和是三的倍数,则这个数可以被三整除,因此不可能是一个素数。我们可以试着计算所有两位数以上的全数字各位数之和: \[ \begin{aligned} 1+2&=3\\ 1+2+3&=6\\ 1+2+3+4&=10\\ 1+2+3+4+5&=15\\ 1+2+3+4+5+6&=21\\ 1+2+3+4+5+6+7&=28\\ 1+2+3+4+5+6+7+8&=36\\ 1+2+3+4+5+6+7+8+9&=45 \end{aligned} \] 我们可以很明显看到,只有四位和七位全数字的各位数之和不是三的倍数,因此只有这两个数位的全数字中可能存在素数。考虑到七位数必然大于四位数,所以我们从最大的七位全数字7654321开始筛选,依次寻找一个更小的素数,然后判断这个素数是否为全数字。判断的方法是检查该数字对应的字符串构成的集合是否等于由字符串1234567构成的集合,如果等于则是一个全数字,如果不等于就不是。我们首先在七位数的范围内寻找满足要求的数,如果找不到,再在四位数范围内寻找。经过尝试

欧拉工程第一至十题解题思路分析

不打扰是莪最后的温柔 提交于 2019-12-03 23:08:52
一、3或5的倍数(multiples of 3 and 5) 如果我们将小于10的所有是3或5倍数的自然数列出来,我们得到3,5,6和9,它们的和是23。与之类似,计算1000以下所有是3或5的倍数的自然数的和。 分析:此题至少有两种解法,第一种解法较为直接,将1000以下所有3或5的倍数列出再求即可,在python中使用列表推导式只需要一行代码即可。第二种思路是使用求和公式,分别求出1000以下所有三的倍数和五的倍数的和再减去十五的倍数的和,即: \[ s=\sum_{i=1}^{333}3i+\sum_{i=1}^{199}5i-\sum_{i=1}^{66}15i=\frac{3}{2}\cdot333(333+1)+\frac{5}{2}\cdot199(199+1)-\frac{15}{2}\cdot66(66+1) \] 第一种思路的实现代码如下: def main(): ans = sum([x for x in range(1,1000) if x%3==0 or x%5==0]) return ans 二、偶数斐波那契数(even Fibonacci numbers) 斐波那契序列中的数都是由前两项加总得出,假设第一与第二项为1与2,则前十项分别为: \[ 1,2,3,5,8,13,21,34,55,89 \] 考虑不超过四百万的斐波那契数

数学笔记 - 数论 - Miller-Rabin算法

Deadly 提交于 2019-12-03 17:16:32
对 于大数的素性判断,目前Miller-Rabin算法应用最广泛。一般底数仍然是随机选取,但当待测数不太大时,选择测试底数就有一些技巧了。比如,如果 被测数小于4 759 123 141,那么只需要测试三个底数2, 7和61就足够了。当然,你测试的越多,正确的范围肯定也越大。如果你每次都用前7个素数(2, 3, 5, 7, 11, 13和17)进行测试,所有不超过341 550 071 728 320的数都是正确的。如果选用2, 3, 7, 61和24251作为底数,那么10^16内唯一的强伪素数为46 856 248 255 981。这样的一些结论使得Miller-Rabin算法在OI中非常实用。通常认为,Miller-Rabin素性测试的正确率可以令人接受,随机选取 k个底数进行测试算法的失误率大概为4^(-k)。 参考资料: 素数与素性测试(Miller-Rabin测试) - Norlan - 博客园 来源: https://www.cnblogs.com/KisekiPurin2019/p/11804467.html

js求100以内的素数

◇◆丶佛笑我妖孽 提交于 2019-12-03 14:02:35
//打印2~100之间的数 for(var i=2 ; i<100 ; i++){ var a = true; for(var j = 2; j < i; j++){ //判断i能否被j整除 if(i%j == 0){ //能被整除则说明不是素数,修改布尔值为false a = false ; } } //打印素数 if(a){ console.log(i); } } 判断 1-100之间所有的素数 来源: https://www.cnblogs.com/lvxisha/p/11798209.html

等差素数序列

懵懂的女人 提交于 2019-12-03 12:06:51
等差素数数列 问题描述 类似 7,37,67,97 和 107,137,167,197 ,这样有素数组成的数列叫做等差素数数列。素数数列具有项数的限制,一般指素数数列的项数有多少个连续项,最多可以存在多少个连续项。 编程找出100以内的等差素数数列。  算法思路 使用筛法找出100内的素数,存在素数表prime中 在prime中找出任意两数构成素数等差数列的a0,a1 计算出a2,判断其是否为素数,如果是则加入素数等差数列的列表s中  代码示例 Python pt = [True] * 1000 # 筛表 def isPrime(n): if pt[n]: for x in range(n ** 2, len(pt), n): pt[x] = False return True else: return False # 1. 构建素数表 prime = [] # 素数表 for x in range(2, 101): if isPrime(x): prime.append(x) # print(prime) # 2. 任取prime中的两个数作为a0,a1 for i in range(len(prime)): for j in range(i + 1, len(prime)): a0, a1 = prime[i], prime[j] d = a1 - a0 # 公差 an =

[数论系列] 素数篇

我只是一个虾纸丫 提交于 2019-12-03 10:13:22
本章介绍关于素数的一些数论,限于篇幅不给出证明,需要证明的朋友自行相关证明。 什么是素数?只能被自己和1整除的数就是素数。 利用这个性质我们很容易得到下面的素数判断方法。 bool isPrime(int x){ if(x==1)return 0; for(int i=2;i*i<=x;i++) if(x%i==0)return 0; return 1; } 这里解释一下为什么是i*i<=x,i*i<x转化一下就是i<=sqrt(x)。 想一想,如果我们枚举到sqrt(x)都没有找到可以被它整除的数,后面也就不可能有可以被它整除的数了,因为一个>sqrt(x)的数要是被x整除了,它的商肯定是<sqrt(x)的,而我们已经枚举过<=sqrt(x)的数了,里面没有,所以>sqrt(x)的约数也是不可能有的。 这种判断方法的时间复杂度是O(sqrt(n))的,空间复杂度是O(1)的。 再给出一个判断方法,这个方法的时间复杂度大概是O(sqrt(n)/3)的,空间复杂度也是O(1)。 bool isPrime(int x){ if(x==1)return false; if(x==2||x==3)return true; if(x%6!=1&&x%6!=5)return false; for(int i=5;i*i<=x;i+=6) if(x%i==0||x%(i+2)==0)return

如何构造素数表

五迷三道 提交于 2019-12-03 09:51:24
构造素数表 欲构造n以内不含n的素数表 1.开辟prime[n],初始化其所有元素为1,prime[x]为1表示x是素数 2.令x等于2 3.如果x是素数,则对于(i=2;x*i<n;i=i+1)令prime[i*x]=0 4.令x=x+1,如果x<n,重复3,否则结束 # include <stdio.h> int main() { const int maxnumber=25; /*const定义常量,但是这样的话就没法从下面用scanf_s输入改变的maxnumber*/ int i, x; int isprime[maxnumber]; /*只能用const定义,否则[]就会出现error,所以很矛盾*/ for (i = 0; i < maxnumber; i = i + 1) { isprime[i] = 1; /*将所有的都变成1*/ } for (x = 2; x < maxnumber; x = x + 1) /*把2i去掉,把3i去掉,把4i去掉...........把ni去掉*/ { if (isprime[x]) /*其实有没有这个if都行,这个减少了for循环的次数,优化了程序 不过确实大大的减少了程序运行的次数,尤其是数越大越明显*/ { for (i = 2; i *x< maxnumber; i = i + 1) { isprime[i * x] =