最大素数

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

时光总嘲笑我的痴心妄想 提交于 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 \] 考虑不超过四百万的斐波那契数

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里面的素数 { }

C语言I博客作业05

不问归期 提交于 2019-12-02 05:42:56
这个作业属于哪个课程 这个作业要求在哪里 我在这个课程的目标是 这个作业在哪个具体方面帮助我实现目标 参考文献 C语言程序设计II C语言I—2019秋作业05 , C语言作业评价标准 熟悉并掌握基本的程序语言,拥有独立完成能力 进一步强化C语言的基础学习,学习掌握自定义函数,同时通过PTA作业了解自定义函数在实际编程语言中的应用 集美大学林丽老师 , 思维导图 , 百度百科 1.PTA实验作业 1.1 题目名    本题要求实现一个函数,判断任一整数是否为水仙花数 (必须是三位数,且数的每一位上数字的立方和与数本身相等) 例如153=1^3+5^3+3^3=1+125+27=153,而1或155则不是水仙花数。如果是水仙花数,则函数返回1,否则返回0. 1.1.1 数据处理    ①数据表达:使用了整形常量a,b,c,分别作为输入三位数数据的个位十位百位;    ②数据处理:使用了 if else选择语句 ,若符合条件返回1,不符合返回0。    ③函数参数:主调函数是 “int main()” 被调函数是 “int func(const int N)” 是整形函数‘实参是N,形参是a,b,c,它们都是整形。 1.1.2实验代码截图 1.1.3 造测试数据 输入数据 输出数据 说明 100 0 最小三位数100 99 0 使用非三位数 999 0 最大三位数999 153 1

LA2955 Vivian难题——梅森素数

岁酱吖の 提交于 2019-12-02 02:50:17
题意 输入 $k$(1 \leq k \leq 100)个正整数 $p_1, p_2, ..., p_k$(1 < p_i < 2{31}),找出 $k$ 个非负整数 $e_i$ 使得 $N = \prod _{i=1}^k {p_i}^{e_i}$ 为 $2^x$,$x$ 为正整数。注意,由于 $x>0$,$e_i$ 不能全为0.如果无解输出NO,否则输出最大的 $x$。 分析 梅森数:$2^p-1$,指数 $p$ 是素数。常记为 $Mp$. 如果梅森数是素数,就称为梅森素数。 若 $2^n-1$ 是素数,则指数 $n$ 也是素数(假设 $n$ 是合数,$2^n-1$ 一定能被分解) 若 $n$ 是素数,$2^n-1$ 却未必是素数。 有一个重要的性质:“一个数能够写成 $n$ 个不重复的梅森素数的乘积” 等价于 "这个数的约数和是2的幂"。 例如,$2^3-1=7$,7的约数为1和7,$1+7 = 2^3$ 必须是不重复的,$3 \times 3 = 9$,但9的约数1、3、6、9,和不是2的幂。 在题给的范围内,梅森素数只有8个。 代码 感觉爆搜就可以了,不会写 参考链接: 1. https://blog.csdn.net/miku23736748/article/details/52135932 2. https://blog.csdn.net/acm_cxlove

Acwing-198-反素数(约数, 数学)

爱⌒轻易说出口 提交于 2019-11-30 07:50:30
链接: https://www.acwing.com/problem/content/200/ 题意: 对于任何正整数x,其约数的个数记作g(x),例如g(1)=1、g(6)=4。 如果某个正整数x满足:对于任意的小于x的正整数 i,都有g(x)>g(i) ,则称x为反素数。 例如,整数1,2,4,6等都是反素数。 现在给定一个数N,请求出不超过N的最大的反素数。 思路: 考虑前11个素数的乘积大于2e9, 可以对n用前10个质数进行质数分解. 考虑2^31 > 2e9. 然后限制一下范围, DFS跑一遍. 代码: #include <bits/stdc++.h> using namespace std; typedef long long LL; const LL MAXV = 2e9; int Pri[20] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29}; int Cnt[20]; LL cnt, res, n; LL Pow(LL a, int b) { LL tmp = 1; while (b > 0) { if (b&1) tmp *= a; a *= a; b >>= 1; } return tmp; } void Dfs(int step, LL val) { // cout << step << ' ' << val <<

luogu P1045 麦森数

倖福魔咒の 提交于 2019-11-30 00:08:13
https://www.luogu.org/problem/P1045 题目描述 形如 2 P − 1 2^{P}-1 2 P − 1 的素数称为麦森数,这时P一定也是个素数。但反过来不一定,即如果PPP是个素数, 2 P − 1 2^{P}-1 2 P − 1 不一定也是素数。到1998年底,人们已找到了37个麦森数。最大的一个是P=3021377,它有909526位。麦森数有许多重要应用,它与完全数密切相关。 任务:从文件中输入PPP(1000<P<3100000),计算 2 P − 1 2^{P}-1 2 P − 1 的位数和最后500位数字(用十进制高精度数表示) 输入格式 文件中只包含一个整数P(1000<P<3100000) 输出格式 第一行:十进制高精度数 2 P − 1 2^{P}-1 2 P − 1 的位数。 第2-11行:十进制高精度数 2 P − 1 2^{P}-1 2 P − 1 的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0) 不必验证 2 P − 1 2^{P}-1 2 P − 1 与P是否为素数。 输入输出样例 输入 #1 1279 输出 #1 386 00000000000000000000000000000000000000000000000000

【C++】欧拉素数筛的理解与实现

独自空忆成欢 提交于 2019-11-29 11:58:28
在传统的素数筛法中,我们使用了对于每一个数n,在 1~(√n) 范围内进行取模检查,这样逐一判断的复杂度为n(√n)。 但如果我们需要更快的筛法时怎么办? 于是著名的 欧拉筛 诞生了。它能将复杂度降为 O(n) 级别。 1.关键理解: 欧拉筛的原理是保证在 2~n 范围中的每一个合数都能被 唯一分解成它的最小质因数与除自己外最大的因数相乘的形式 。因此我们枚举2~n中的每一个数作为筛法中的“除自己外的最大因数”,如果它未被标记为合数,就先将它放入素数表内,再将这个最大因数与素数表中已经找到的素数作为最小质因数相乘,将得到的这些数标记为合数。最后输出得到的素数表即可。 但是我们如何保证 每个合数都被唯一分解 ? 解决方法如下: 当此时取出的素数表中的素数(即枚举的最小质因子)整除于当前枚举的合数时,我们就停止循环素数表,开始枚举下一个合数。 证明如下: 设当前枚举的最小质因子prime[i]整除于合数n时,即我们要筛掉合数 n*prime[i] ;如果我们此时不退出,继续枚举下一个素数prime[i+1],对于将要筛掉的合数 n*prime[i+1] 由于插入顺序从小到大,则 prime[i+1]>prime[i] 。由于prime[i]整除于合数n,所以必然合数 n*prime[i+1] 还可以被分解为 $$ (\frac n {prime[i]} prime[i+1])

UVA 10852 Less Prime 题解

眉间皱痕 提交于 2019-11-28 21:49:10
Less Prime Let n be an integer, 100 n 10000, nd the prime number x, x n, so that n 􀀀 p x is maximum, where p is an integer such that p x n < (p + 1) x. Input The rst line of the input contains an integer, M, indicating the number of test cases. For each test case, there is a line with a number N, 100 N 10000. Output For each test case, the output should consist of one line showing the prime number that veries the condition above. Sample Input 5 4399 614 8201 101 7048 Sample Output 2203 311 4111 53 3527 题意:给出一个n,问:n-p*x 取最大值时x的值是多少,其中p满足p*x<=n<(p+1)*x。 根据p*x<=n<(p+1)*x可以得出n-px的值一定小于x,所以对n-p

[HAOI2007]反素数

こ雲淡風輕ζ 提交于 2019-11-28 18:42:02
题目描述 对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。 现在给定一个数N,你能求出不超过N的最大的反质数么? 输入格式 一个数N(1<=N<=2,000,000,000)。 输出格式 不超过N的最大的反质数。 对于一个反质数n 一定有n=p1^(c1)+p2^(c2)+……+pm^(cm); 其中p1……pm为依次递增的质数 c1……cm为依次严格不上升的序列 根据范围可得p最多有10个不同的质数 暴力搜索就好 #include<bits/stdc++.h> #define re return #define ll long long #define inc(i,l,r) for(int i=l;i<=r;++i) using namespace std; template<typename T>inline void rd(T&x) { char c;bool f=0; while((c=getchar())<'0'||c>'9')if(c=='-')f=1; x=c^48; while((c=getchar())>='0'&&c<='9')x=x*10+(c^48); if(f)x=-x; } ll n,m,ans,ans_cnt,a