欧拉

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

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

欧拉计划的Python解法(11-13)

狂风中的少年 提交于 2019-12-03 12:12:47
Problem 11. Largest product in a grid In the 20x20 grid below, four numbers along a diagonal line have been marked in red. 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94

欧拉回路

给你一囗甜甜゛ 提交于 2019-12-03 09:09:56
钟长者(Orz)的课堂总结 一,欧拉回路:能够从一个点出发,不重复的走过每一条边,回到起点的路径称为欧拉回路。 判定条件:对于无向图:1,图是连通图 2,所有点的度数均为偶数 对于有向图:1,图是连通图 2,所有点的入度等于出度 二,欧拉路径:能够从一个点出发,不重复的走过每一条边的路径称为欧拉路径。 判定条件:对于无向图:1,图是连通图 2,有且只有两个点的度为奇数,其余点的度均为偶度。 *对于一个无向图若有2*k个奇度数的点,则为一个k笔画问题。 对于有向图:1,图是连通图 2,有且只有一个点出度减入度等于1,有且仅有一个点 的出度-入度等于1,其余所有点的入度等于出度。 求欧拉路径数量:BEST定理。 题1:给定一张无向图,要求把边分成两部分,使得任意一部分都组成一条路径。 若联通块的数量大于2,则无解; 如果联通块的数量等于二,则当且仅当两个联通块都存在欧拉回路 时有解。若联通块数量为1,若存在一条欧拉回路,则任意切开两个点分为两个集合即可,若存在一条 欧拉路径,同上,若是k(k=2)笔画问题,首先要有四个点的度为奇数,再两个奇数度的点之间连一条 边,判断一下是否存在欧拉回路即可。 *k笔画是否存在问题均转化成欧拉回路问题。 来源: https://www.cnblogs.com/Hoyoak/p/11785113.html

欧拉回路模板

匿名 (未验证) 提交于 2019-12-03 00:29:01
(1)判断 欧拉回路(把所有边走一遍,最后回到起点) 无向图的所有点度数为偶数, 且联通 有向图的所有点入度=出度, 且联通 欧拉道路( 把所有边走一遍 , 不回到起点) 无向图 所有点的度数为偶数 或者 除了两个度数为奇数外其余的全是偶数。同时要联通(忽略方向) 有向图所有点 出度=入度 或者 一个顶点 出度=入度+1,另一个顶点 入度=出度+1 。 同时要联通(忽略方向) (2)输出路径 int dfs(u) //欧拉回路则从任意点开始, 欧拉道路要从起点开始(出度=入度+1) { REP(i, 0, g[u].size()) { int v = g[u][i]; if(!vis[u][v]) //这条边还没有遍历过 { vis[u][v] = vis[v][u] = 1; //这是无向图, 有向图则改为 vis[u][v] = 1 dfs(v); stack.push(node(u, v)); //注意最后从栈顶输出到栈底 } //这句话一定要在dfs后面 } } 文章来源: 欧拉回路模板

欧拉回路判断规则

匿名 (未验证) 提交于 2019-12-02 23:49:02
无向图:因为欧拉路径中,除了起点与终点以外,任意点的“进”“出”次数相等,所以除了两个点为奇点(度数为奇数的点)(终点和起点)以外,其它点的度数均为偶数。 如果是欧拉回路,奇点的个数应该为0。 有向图:欧拉路径中,最多只有两个点的入度不等于出度。起点出度比入度大1,终点入度比出度大1。 如果是欧拉回路,所有点的 入度=出度 。

欧拉回路与欧拉路径

匿名 (未验证) 提交于 2019-12-02 23:47:01
什么叫颓,我是彻底明白了。 定义: 欧拉路径:在一个图中,由i点出发,将每个边遍历一次最终到达j点的一条路径。 欧拉回路:i=j时的欧拉路径。(也就是把所有边绕一边,最后回到自己)。 判断欧拉回路: 判断 欧拉路径:

欧拉路径与欧拉回路

匿名 (未验证) 提交于 2019-12-02 23:39:01
欧拉路径 :欧拉路是指从图中任意一个点开始到图中任意一个点结束的路径,并且图中每条边通过的且只通过一次。 欧拉回路 :欧拉回路是指起点和终点相同的欧拉路。 二、存在欧拉路的条件: 1.无向连通图存在欧拉路的条件: 所有点度都是偶数,或者恰好有两个点度是奇数,则有欧拉路。若有奇数点度,则奇数点度点一定是欧拉路的起点和终点,否则可取任意一点作为起点。 2.有向连通图存在欧拉路的条件: ①每个点的入度等于出度,则存在欧拉回路(任意一点有度的点都可以作为起点) ②除两点外,所有入度等于出度。这两点中一点的出度比入度大,另一点的出度比入度小,则存在欧拉路。取出度大者为起点,入度大者为终点。 所以判断一个 有向图 是否存在欧拉路的步骤: ①判断所有点的入度与出度是否相等,或者只有两个点的出度和入度不相等,这两个点其中有一个点的入度=出度+1(终点),另一个点的出度=入度+1(起点). ②将有向图转化为无向图,判断图中各点是否连通(即判断连通图,可用dfs或者并查集) 所以判断一个 无向图 是否存在欧拉路的步骤: ①统计所有结点的度,要么都为偶数,要么只有两个结点的度为奇数。 ②判断图中各点是否连通(即判断连通图,可用dfs或者并查集) 例题: UVA 10129 输入n个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如acm、mam

欧拉反演?

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-02 12:57:38
大意是:求证 \[\sum_{d|n} \varphi(d)=n\] 定理①: \[\sum_{z|mn}\varphi(z)=\sum_{x|m}\varphi(x)\sum_{y|m}\varphi(y)(\gcd(m,n)=1)\] 有 \(\sum\) 在里面不太好看,设 \(m\) 的所有因数为: \(a_1,a_2...a_k\) , \(n\) 的所有因数为: \(b_1,b_2...b_l\) 乘起来后易得: \[\sum\limits_{i=1}^k\sum\limits_{j=1}^l\varphi(a_i)\varphi(b_j)=\sum_{x|m}\varphi(x)\sum_{y|m}\varphi(y)=\sum_{z|mn}\varphi(z)\] 所以该结论成立。 定理②: \[\varphi(a^b)=a^b-a^{b-1}\] 其中 \(a\) 是质数。 在 \([1,a^b]\) 中,只有 \(a\) 的倍数与 \(a^p\) 不互质共有 \(a^{b-1}\) 个 所以该结论成立。 运用该结论,我们知道 \(\sum_{d|p^m}\varphi(d)=\varphi(1)+\varphi(p)+...+\varphi(p^m)\) ( \(p\) 是质数) \(=1+\sum\limits_{i=1}^m(p^i-p^{i-1})\) \

ACM竞赛数学学习笔记

无人久伴 提交于 2019-12-02 06:48:54
目录 欧拉筛的证明 欧拉筛的证明 之前一直都是贴板子。今天花了一点时间看了下证明,原来是如此简洁优雅。欧拉大神orz 一。正确性。 对于任何一个合数C,设p为C的最小质因子,令A=C/p,那么显然有A的最小质因子大于等于p,于是在进行到A枚举已存储的质数时,枚举到A的最小质因子之前p一定被枚举到了,于是C一定被筛出了。这就证明了所有的合数都会被筛出,也就证明了欧拉筛的正确性。 二。时间的线性。 只需要证明任何一个合数都不会被重复筛。 观察欧拉筛的过程发现所有的合数都是以一个质数乘另一个数的形式被筛出的。那么设C=A·p1,p1是C的最小质因子,假设存在另一组数满足C=B·p2,则有p2大于等于p1,而B的质因子必然包含p1,那么当进行到B的时候,在枚举到p1的时候就已经退出循环,于是C不会被重复筛出。即证明了时间复杂度。 来源: https://www.cnblogs.com/vege-chicken-rainstar/p/11735216.html