欧拉

【转】欧拉筛素数

不羁岁月 提交于 2020-04-04 12:50:09
#include <cstdio> #include <cstring> bool isPrime[100000010]; //isPrime[i] == 1表示:i是素数 int Prime[5000010], cnt = 0; //Prime存质数 void GetPrime(int n)//筛到n { memset(isPrime, 1, sizeof(isPrime)); //以“每个数都是素数”为初始状态,逐个删去 isPrime[1] = 0;//1不是素数 for(int i = 2; i <= n; i++) { if(isPrime[i])//没筛掉 Prime[++cnt] = i; //i成为下一个素数 for(int j = 1; j <= cnt && i*Prime[j] <= n/*不超上限*/; j++) { //从Prime[1],即最小质数2开始,逐个枚举已知的质数,并期望Prime[j]是(i*Prime[j])的最小质因数 //当然,i肯定比Prime[j]大,因为Prime[j]是在i之前得出的 isPrime[i*Prime[j]] = 0; if(i % Prime[j] == 0)//i中也含有Prime[j]这个因子 break; //重要步骤。见原理 } } } int main() { int n, q; scanf("%d

【LG5018】[NOIP2018pj]对称的二叉树

痞子三分冷 提交于 2020-03-27 04:17:34
【LG5018】[NOIP2018pj]对称的二叉树 题面 洛谷 题解 看到这一题全都是用 \(O(nlogn)\) 的算法过的 考场上写 \(O(n)\) 算法的我很不开心 然后就发了此篇题解。。。 首先我们可以像树上莫队一样按照 左-右-根 的顺序将这棵树的欧拉序跑下来, 记下开始访问点 \(x\) 的 \(dfs\) 序 \(L[x]\) ,和回溯时的 \(dfs\) 序 \(R[x]\) 再将记录欧拉序的数组记为 \(P\) void dfs(int x) { P[L[x] = ++cnt] = x; if (t[x].ch[0]) dfs(t[x].ch[0]); if (t[x].ch[1]) dfs(t[x].ch[1]); P[R[x] = ++cnt] = x; t[x].size = t[t[x].ch[0]].size + t[t[x].ch[1]].size + 1; } 统计出数组 \(P\) 的两个哈希值,一个是记录点权( \(hs1[0][x]\) ), 另一个是记录当前点是左儿子还是右儿子( \(hs2[0][x]\) ) for (int i = 1; i <= cnt; i++) hs1[0][i] = hs1[0][i - 1] * base + t[P[i]].v; for (int i = 1; i <= cnt; i++) hs2[0]

欧拉图 欧拉回路 欧拉通路 Euler

女生的网名这么多〃 提交于 2020-03-17 06:55:48
欧拉图 本文链接: http://www.cnblogs.com/Ash-ly/p/5397702.html 定义: 欧拉回路:图G的一个回路,如果恰通过图G的每一条边,则该回路称为欧拉回路,具有欧拉回路的图称为欧拉图。欧拉图就是从图上的一点出发,经过所有边且只能经过一次,最终回到起点的路径。 欧拉通路:即可以不回到起点,但是必须经过每一条边,且只能一次。也叫"一笔画"问题。 性质:    欧拉回路:一个欧拉回路,删掉一个点,仍然是一个欧拉回路。从一个欧拉回路拖走一个小欧拉回路,结果也是一个欧拉回路。 判定(充要):   欧拉回路:1: 图G是连通的,不能有孤立点存在。        2: 对于无向图来说度数为奇数的点个数为0; 对于有向图来说每个点的入度必须等于出度。   欧拉通路:1: 图G是连通的,无孤立点存在。        2: 对于无向图来说,度数为奇数的的点可以有2个或者0个,并且这两个奇点其中一个为起点另外一个为终点。 对于有向图来说,可以存在两个点,其入度不等于出度,其中一个出度比入度大1,为路径的起点;另外一个入度比出度大1,为路径的终点。 算法(求欧拉回路): Fleury算法: 设图G是一个无向欧拉图,则按照下面算法求欧拉回路: 1:任取G中一个顶点v0,令P0 = v0. 2:假设沿Pi = v0e1v1e2v2……eivi 走到了顶点 vi

欧拉路与欧拉回路

夙愿已清 提交于 2020-03-05 05:19:19
@kaike 图论起源 图论起源于18世纪,1736年瑞士数学家欧拉(Euler)发表了图论的第一篇论文“哥尼斯堡七桥问题”。在当时的哥尼斯堡城有一条横贯全市的普雷格尔河,河中的两个岛与两岸用七座桥连结起来。当时那里的居民热衷于一个难题:有游人怎样不重复地走遍七桥,最后回到出发点。 为了解决这个问题,欧拉用A,B,C,D4个字母代替陆地,作为4个顶点,将联结两块陆地的桥用相应的线段表示,于是哥尼斯堡七桥问题就变成了图中,是否存在经过每条边一次且仅一次,经过所有的顶点的回路问题了。欧拉在论文中指出,这样的回路是不存在的。 一笔画 1.凡是有偶点组成的连通图,一定可以一笔画成。 2.凡是只有两个奇点的连通图(其余都为偶点),一定可以一笔画成。 3.奇点数/2 可以算出此图需几笔画成。 概念 欧拉通路(欧拉迹):通过图中每条边一次且仅一次,并且过每一顶点的通路。 欧拉回路(欧拉闭迹):通过图中每条边一次且仅一次,并且过每一顶点的回路。 欧拉图:存在欧拉回路的图。欧拉图就是从一顶点出发每条边恰通过一次又能回到出发顶点的图,即不重复的走遍所有的边再回到出发点。 回路:起点和终点相同的通路。 简单图:不含平行边和自回路。 混合图:既有有向边,也有无向边。 平凡图:仅有一个顶点的图。 完全图:有n个顶点且每对顶点都有边相连的无向简单图,称为 无向完全图

哥尼斯堡七桥问题

橙三吉。 提交于 2020-03-05 05:12:26
18世纪著名古典数学问题之一。在 哥尼斯堡 的一个公园里,有七座桥将 普雷格尔 河中两个岛及岛与河岸连接起来(如图)。问是否可能从这四块陆地中任一块出发,恰好通过每座桥一次,再回到起点? 1736年,29岁的欧拉提交了《哥尼斯堡七桥》的论文,圆满解决了这一问题,同时开创了数学新一分支——图论。 欧拉把每一块陆地考虑成一个点,连接两块陆地的桥以线表示。那么上面的图就被抽象成了下图。 图中的A,B,C,D四个点表示两个岛以及河的两岸。这样抽象以后,假设你从某个顶点出发,那么出去的时候走了一座桥,那么你最后回来也必须有一座桥。这就是说,你的起点的桥的数目必须是偶数的。七桥问题中的每个顶点所连接的桥的数目都是奇数个,所以不存在上面的走法。这个问题的实质就是一笔画,欧拉给出了一笔画的条件。 1. 图形必须是连通的。 2. 图中的“奇点”个数是0或2。 后来也就把图中所有边且每边仅通过一次,最后回到起点的回路,称为欧拉回路。具有欧拉回路的图称为欧拉图。 来源: https://www.cnblogs.com/zy666/p/10504295.html

欧拉回路/欧拉路径求解,Fleury算法,Hierhoizer算法

随声附和 提交于 2020-03-02 00:50:00
欧拉路径就是一笔画问题,在一个连通图中,一笔走完所有路径不能有重复路径。 无向图: 具有欧拉回路的 充要条件 图连通,所有点的度数为偶数 具有欧拉路径的 充要条件 图连通,具有0个或者2个奇数度数的结点 有向图: 具有欧拉回路的 充要条件 图连通,所有点的入度等于出度 具有欧拉路径的 充要条件 图连通,一个点的出度大入度1度,一个点的入度大于出度1度,其余点出度等于入度。 Fleury算法跟Hierhoizer算法很相似,但是Hierhoizer算法更快一点,遍历一遍图就可以了。 我感觉核心思想就是圈套圈,有欧拉回路的图可以抽象为很多圈套在一起,试想一下给你很多圈相切的图形,你该如何一笔画?当然是遇到切点就进入切点的园中继续走遇到切点就走。 Hierhoizer算法的思想就是如此。寻找欧拉回路的时候正确的起点出发,遍历该节下一个结点,然后删除此边重复此步骤,在一个存在欧拉路径的路中会找到一个环,然后用一个stack存储路径,从递归深处存储,遇到还有为访问完路径的结点就继续访问,这等价于全是园的图中遇到切点,我们就进入切点继续访问。 看代码辅助理解一下: vector < int > G [ 10000 ] ; //邻接表存图 int nums [ 1000 ] [ 1000 ] ; //存边的条数 stack < int > path ; void dfs ( int s ) {

最小生成树学习笔记

百般思念 提交于 2020-03-01 07:03:03
1. 题意: 这里 解法:这道题需要知道欧拉路径。显然整张图奇度点<=2的时候我们只计算一次就OK了。但对于绝大多数情况,我们要想办法构造一条欧拉路径,这样的话,每条边走的次数<=2,但是每条边走的次数至少为1。如果要构造两个点从奇度边偶度,我们需要把他们之间的一条路径重复添加一次,这样才能满足。题目第i条边权为2^i次方,也就是说前i-1条边相加的权值依旧没有第i条边的权值大,那么我们尽可能添加小边权,怎么做呢?如果在最小生成树上做就很方便了,写法依旧可以看这篇博客,没有提交链接qaq我就没写了。 来源: CSDN 作者: Alex Panda 链接: https://blog.csdn.net/weixin_43262291/article/details/104573948

费马小定理&欧拉定理

允我心安 提交于 2020-02-28 11:49:06
在 p 是素数的情况下,对任意整数 x 都有 x p ≡ x(mod p) 。这个定理被称作费马小定理 其中如果 x 无法被 p 整除,我们有 x p-1 ≡ 1(mod p) 。利用这条性质,在 p 是素数的情况下,就很容易求出一个数的逆元。那上面的式子变形之后得到 a -1 ≡ a p-2 (mod p) ,因此可以通过快速幂求出 逆元 。 我们先来证明一下费马小定理: 费马小定理证明: 一、 准备知识 引理 1 :剩余系定理 2 若 a,b,c 为任意 3 个整数 ,m 为正整数 , 且 (m,c)=1, 则当 ac≡bc(mod m) 时 , 有 a≡b(mod m) 证明: ac≡bc(mod m) 可得 ac–bc≡0(mod m) 可得 (a-b)c≡0(mod m) 因为 (m,c)=1 即 m,c 互质 ,c 可以约去 ,a–b≡0(mod m) 可得 a≡b(mod m) 引理 2 :剩余系定理 5 若 m 为整数且 m>1,a[1],a[2],a[3],a[4],…a[m] 为 m 个整数 , 若在这 m 个数中任取 2 个整数对 m 不同余 , 则这 m 个整数对 m 构成完全剩余系 . 证明:构造 m 的完全剩余系( 0,1,2,…m-1 ) , 所有的整数必然这些整数中的 1 个对模 m 同余 . 取 r[1]=0,r[2]=1,r[3]=2,r[4]

欧拉函数、欧拉定理和费马小定理

断了今生、忘了曾经 提交于 2020-02-28 11:47:37
对于正整数n,欧拉函数是小于等于n的正整数中与n互质的数的数目,表示为φ(n)。 性质1:对于素数p,φ(p)=p-1。 性质2:对于两个互质数p,q,φ(pq)=φ(p)*φ(q)=(p-1)(q-1)。(积性函数)(易证) 性质3:若n是质数p的k次幂,φ(n)=p k -p k-1 =(p-1)p k-1 ,因为除了p的倍数外,其他数都跟n互质。 性质4: 因为:x可以分解成p1 q1 ×p2 q2 ×p3 q3 ……×pn qn (pi为x的质因数) 因为pi qi 两两互质,所以:φ(x)=φ(p1 q1 )×φ(p2 q2 )×φ(p3 q3 )……×φ(pn qn ) (性质2) 所以:φ(x)=(p1 q1 -p1 q1-1 )×(p2 q2 -p2 q2-1 )×(p3 q3 -p3 q3-1 )……×(pn qn -pn qn-1 ) (性质3) 提取x即得到公式。 性质5:n=Σφ(d|n) yu大有个牛逼的证法,把1到n的所有数除以n,变成n个既约分数,分母d只可能是n的约数。并且,以d为分母的分数个数正好是φ(d)。因此,分数总数n=Σφ(d|n)。 欧拉定理: 对于互质的正整数a和n,有 证明: ( 1 ) 令 Zn = {x1, x2, …, xφ(n)} (mod n), S = {a * x1, a * x2, … , a * xφ(n)}

欧拉定理和费马小定理的证明

断了今生、忘了曾经 提交于 2020-02-28 11:47:21
转自博主 https://blog.csdn.net/qq_24451605/article/details/47045279 在看这篇博客之前推荐看一看我对于欧拉函数的递推公式的证明,方便理解。 点击打开链接 ————————————-欧拉定理的内容————————————————————————– a和n互质,那么a^phi(n) == 1 ( mod n ) ————————————欧拉定理的证明————————————————————————— 设xi为n当中与n互质的数,一共有phi(n)个: 1)设mi = a * xi , 则mi与n互质 因为a与n互质,mi也与n互质,所以说这个两个因数当中都没有与n相同的质因子,所以mi也不可能有,所以mi与n必然互质 2)因为mi与n互质,故mi不能被n整除 mi = p*n+q*r 若余数r与n不互质,那么d = gcd ( r , n )!=1 , mi = d*c(c代表一个正整数),那么gcd ( mi , n ) != 1 , 与mi和n互质矛盾! 故mi%n == ri, ri 均与n互质 3)若mi == mj ( mod n ) (i!=j) mi-mj==a*(xi-xj)(mod n ) == 0 ( mod n ) xi和xj均是小于n的正整数,故xi==xj时才能成立,则与i!=j矛盾 故mi