欧拉

Codeforce 547 D. Mike and Fish(欧拉回路 + 思维 + 构造)

北战南征 提交于 2020-01-22 19:36:22
题目大意:二维平面上有 n 个点,对这 n 个点进行黑白染色,使得每行每列都满足 黑色的点和白色的点的个数的差值 小于等于 1. 按行列连边构成一张二分图,X部为 x 坐标, Y部为 y 坐标,一个点的坐标为 (x,y),则连一条从 x 到 y 的边。 问题转化为对边进行染色,使得任意一个点所连的边中,黑色和白色的差值的绝对值不超过 1。 每一个点具有偶数度是无向图具有欧拉回路的充分必要条件,若在二分图上满足这个重复必要条件,则可以在这个二分图上构造一条欧拉回路,每条(x,y)边作为入边时染成黑色,作为出边时染成白色。 这样构造一定满足条件,每一个节点连出去的边一定有一半被染成黑色,一半被染成白色。 对于二分图上奇度数的节点,分别在 X 部和 Y部 构造一个虚点,将它们分别连一条边到虚点上,使得最后可以构造欧拉回路。 可以观察到 X 部奇度数的点的个数的奇偶性,和Y部的相同,使用归纳法证明: 当只有一条边时:显然成立,X 部和 Y 部各有一个节点具有奇度数。 假设二分图有 n 条边时,结论也成立。 当 n = n + 1 时,新加的边必然使得X部和Y部的 奇度数的点的个数的奇偶性同时改变 因此可以证得两边具有奇度数的点的个数的奇偶性一定相同,基于这个性质,为 X,Y分别构建一个虚点,奇度数的点向虚点连边,最后一定能构造出一个具有欧拉回路的二分图。 关于实现: 构造欧拉回路使用

欧拉线性筛更新(猜想)

北城以北 提交于 2020-01-07 08:30:21
猜想 猜想 使用欧拉线性筛解决素数打表预处理,然后再利用巧妙的一部求和 代码实现如下 # include <bits/stdc++.h> using namespace std ; const int N = 16777216 ; //根据题目范围,定义素数筛范围 int prime [ N + 1 ] , n , n1 , c ; //prime素组用于欧拉线性筛处理 bool isprime [ N + 1 ] ; //布尔类型存取是否为素数 int main ( ) { memset ( isprime , true , sizeof ( isprime ) ) ; //先默认所有数为素数 for ( int i = 2 ; i < N ; i ++ ) { if ( isprime [ i ] ) prime [ c ++ ] = i ; //存素数 for ( int j = 0 ; j < c && prime [ j ] * i <= N ; j ++ ) { isprime [ prime [ j ] * i ] = false ; if ( i % prime [ j ] == 0 ) break ; //详见上一篇关于欧拉的博客 } } while ( scanf ( "%d" , & n ) != EOF ) { n1 = 0 ; for ( int i =

__int128取代欧拉降幂

别等时光非礼了梦想. 提交于 2020-01-06 17:51:41
找到了心仪的小姐姐月月后,华华很高兴的和她聊着天。然而月月的作业很多,不能继续陪华华聊天了。华华为了尽快和月月继续聊天,就提出帮她做一部分作业。 月月的其中一项作业是:给定正整数A、B、P,求ABmodPABmodP的值。华华觉得这实在是毫无意义,所以决定写一个程序来做。但是华华并不会写程序,所以这个任务就交给你了。 因为月月的作业很多,所以有T组询问。 一开始以为一个欧拉降幂+大数取模就够了,结果发现不是,反正过不了。然后就发现了就__int128这个东西,好用。就是输入输出cin scanf cout printf都不行,你可以转成字符串输出。 # include <bits/stdc++.h> using namespace std ; # define ll long long ll t , aa , bb , pp ; __int128 a , b , p ; void slove ( ) { ll ans = 1 ; while ( b ) { if ( 1 & b ) { ans = ans * a % p ; } b / = 2 ; a = a * a % p ; } cout << ans ; printf ( "\n" ) ; } int main ( ) { cin >> t ; while ( t -- ) { cin >> aa >> bb >> pp ;

欧拉回路与欧拉路径

元气小坏坏 提交于 2019-12-27 04:32:33
原文地址:https://blog.csdn.net/qq_34454069/article/details/77779300 定义: 欧拉回路:每条边恰好只走一次,并能回到出发点的路径 欧拉路径:经过每一条边一次,但是不要求回到起始点 无向图 首先,在无向图中,要确定是否存在欧拉回路很容易:只要每个点的度数均为偶数即可。(这里就不扯什么连不连通的鬼东西了)。 因为每个点的度数为偶数,所以可以将整个图看做由数个环嵌套而成,因为环一定能找到一条欧拉回路,所以整个图也能找到欧拉回路。 欧拉路径:如果有且仅有两个点的度数为奇数,就会存在一条从这两个中的一个到达另一个的欧拉路径。 假如在这两个点间连一条边,就能够从任意一个点出发找到一条欧拉回路,当出发点为这两个点中的一个时,切断这条边,就成为一条欧拉路径了。 有向图 欧拉回路:所有点的入度等于出度,就存在一条欧拉回路。 这里可以换一种角度来理解,对于每一个点,每次进入这个节点,就一定有一条路可以出去,因此必定存在一条欧拉回路。 欧拉路径:最多有一点入度等于出度+1,最多有一点入度等于出度-1,就会有一条从出度大于入度(没有则等于)的点出发,到达出度小于入度(没有则等于)的点的一条欧拉路径。证明方法与无向图的欧拉路径类似。 来源: https://www.cnblogs.com/WTSRUVF/p/9359239.html

POJ 1300 Door Man(欧拉通路)

ⅰ亾dé卋堺 提交于 2019-12-27 04:31:10
题目描写叙述: 你是一座大庄园的管家。 庄园有非常多房间,编号为 0、1、2、3。...。 你的主人是一个心不在 焉的人,常常沿着走廊任意地把房间的门打开。多年来,你掌握了一个诀窍:沿着一个通道,穿 过这些大房间,并把房门关上。你的问题是是否能找到一条路径经过全部开着门的房间。并使得: 1) 通过门后马上把门关上。 2) 关上了的门不再打开。 3) 后回到你自己的房间(房间 0),而且全部的门都已经关闭了。 在本题中。给定房间列表。及连通房间的、开着的门。并给定一个起始房间。推断是否存在 这种一条路径。不须要输出这种路径。仅仅需推断是否存在。 假定随意两个房间之间都是连通 的(可能须要经过其它房间)。 输入描写叙述: 输入文件包括多个(多可达 100 个)測试数据,每一个測试数据之间没有空行隔开。 每一个測试数据包括 3部分: 起始行-格式为“START M N”,当中 M 为管理员起始所处的房间号。N 为房间的总数(1 ≤N≤20); 房间列表-一共 N行,每行列出了一个房间通向其它房间的房间号(仅仅需列出比它的号码大 的房间号,可能有多个,按升序排列),比方房间 3有门通向房间 1、5、7。则房间 3的信息行内 容为“5 7”,第一行代表房间 0,后一行代表行间 N-1。 有可能有些行为空行。当然后一行肯 定是空行,由于 N-1 是大的房间号;两个房间之间可能有多扇门连通。

POJ 1300 Door Man(欧拉通路)

匆匆过客 提交于 2019-12-27 04:30:58
题目描写叙述: 你是一座大庄园的管家。 庄园有非常多房间,编号为 0、1、2、3,...。 你的主人是一个心不在 焉的人,常常沿着走廊任意地把房间的门打开。 多年来,你掌握了一个诀窍:沿着一个通道,穿 过这些大房间,并把房门关上。你的问题是是否能找到一条路径经过全部开着门的房间。并使得: 1) 通过门后马上把门关上; 2) 关上了的门不再打开。 3) 后回到你自己的房间(房间 0)。而且全部的门都已经关闭了。 在本题中,给定房间列表。及连通房间的、开着的门。并给定一个起始房间,推断是否存在 这种一条路径。不须要输出这种路径。仅仅需推断是否存在。 假定随意两个房间之间都是连通 的(可能须要经过其它房间)。 输入描写叙述: 输入文件包括多个(多可达 100 个)測试数据。每一个測试数据之间没有空行隔开。 每一个測试数据包括 3部分: 起始行-格式为“START M N”,当中 M 为管理员起始所处的房间号,N 为房间的总数(1 ≤N≤20); 房间列表-一共 N行,每行列出了一个房间通向其它房间的房间号(仅仅需列出比它的号码大 的房间号。可能有多个,按升序排列)。比方房间 3有门通向房间 1、5、7,则房间 3的信息行内 容为“5 7”。第一行代表房间 0,后一行代表行间 N-1。有可能有些行为空行,当然后一行肯 定是空行,由于 N-1 是大的房间号;两个房间之间可能有多扇门连通。

欧拉函数与欧拉定理

跟風遠走 提交于 2019-12-27 04:06:40
欧拉函数 φ ( n ) o r ϕ ( n ) \varphi(n) or \phi(n) φ ( n ) o r ϕ ( n ) 表示小于n的正整数与n互质的数的个数. 显然有: 当n为质数时 φ ( n ) \varphi(n) φ ( n ) 当n为奇数时 φ ( 2 n ) = φ ( n ) \varphi(2n) = \varphi(n) φ ( 2 n ) = φ ( n ) 证明: ∵ \because ∵ 欧拉函数为积性函数. ∴ φ ( 2 n ) = φ ( 2 ) ∗ φ ( n ) \therefore \varphi(2n) = \varphi(2) \ast \varphi(n) ∴ φ ( 2 n ) = φ ( 2 ) ∗ φ ( n ) ∵ φ ( 2 ) = 1 \because \varphi(2)=1 ∵ φ ( 2 ) = 1 ∴ φ ( 2 n ) = φ ( n ) \therefore \varphi(2n) = \varphi(n) ∴ φ ( 2 n ) = φ ( n ) 欧拉函数通项公式 φ ( n ) = n ( 1 − 1 p 1 ) ( 1 − 1 p 2 ) ( 1 − 1 p 3 ) . . . ( 1 − 1 p k ) \varphi (n)= n (1 - \frac {1} {p_1})(1 -

混合图的欧拉回路

旧巷老猫 提交于 2019-12-26 15:10:10
混合图: 即有的边有向,有的边无向。 定义: 对于图G的一个回路,若它恰通过G中每条边一次,则称该回路为 欧拉(Euler)回路 。 具有欧拉回路的图称为 欧拉图 (简称E图)。 定理 : 一个无向图是欧拉图,当且仅当该图所有顶点度数都是偶数。 一个有向图是欧拉图,当且仅当该图所有顶点度数都是0。 有向图存在欧拉回路的充要条件:基图(把所有有向边变成无向边以后得到的图)连通,且每个点的出度等于入度。 所以求混合图的关键是:判断能否存在一个定向,使得每个节点的入度等于出度。 因此可以用网络流来做。建边方法,黑书上有两种,这里讲第二种,更好一点的。图的点数为n + 2,边数为 m + n,其中,n为原点数,m为原边数。 黑书上的讲的我没看太懂,按照我自己的理解,讲一下建图过程。 在原图中,首先给每条无向边任意定向,构成一个有向图,计算每个点的度deg,入度为正,出度为负,如果某个点的deg为奇数,显然不存在欧拉回路。由于原来的有向边,不能更改方向,无用,删了,对原图中的无向边定向后构成的有向图,如果点 i 到j 有一条弧,弧< i , j >容量加1(i 到 j 有多条边的时候,即有重边,可以一条边,多容量代替) 增加源点S,汇点T,对于每个点 i ,如果deg < 0,即出度大于入度,从S引一条弧到 i ,容量为(- deg ) / 2;如果deg > 0, 即入度大于出度,从 i

线性筛素数(欧拉筛)

笑着哭i 提交于 2019-12-18 03:19:44
欧拉筛是O(n)复杂度的筛素数算法,1秒内埃筛能处理1e6的数据,而1e7的数据就必须用欧拉筛了。 埃筛的基本思想是:素数的倍数一定是合数。 欧拉筛基本思想是:任何数与素数的乘积一定是合数 算法概述: 遍历 [2, n] 的所有数 i ,内层循环遍历已经找到的素数 prime[j] ,将 i * prime[j] 标记为合数。 内层循环的最后,检查如果 prime[j] 是 i 的最小质因子,则退出到外层循环,因为 prime[j+1] * i 肯定已经被筛过了。 代码: # include <bits/stdc++.h> using namespace std ; const int MAXN = 1e7 + 5 ; int isPrime [ MAXN ] ; // isPrime[i] 表示i是否素数 int prime [ MAXN ] ; // 按顺序存素数 int cnt = 0 ; // 素数个数 // 找出n以内的全部(cnt个)素数 void euler ( int n ) { memset ( isPrime , 1 , sizeof ( isPrime ) ) ; // 默认全是素数 cnt = isPrime [ 0 ] = isPrime [ 1 ] = 0 ; // 素数个数清零,标记0和1不是素数 // 已知 [2, n] 之间的每一个数 i

hdu 1956 (网络流解决欧拉回路)

冷暖自知 提交于 2019-12-17 13:46:35
题目连接:https://vjudge.net/problem/HDU-1956 题意:给定一些点和一些边,有些边是有向的,,有些边是无向的,求是否存在欧拉回路。 题解:想不到的网络流。 混合图: 即有的边有向,有的边无向。 定义: 对于图G的一个回路,若它恰通过G中每条边一次,则称该回路为 欧拉(Euler)回路 。 具有欧拉回路的图称为 欧拉图 (简称E图)。 定理 : 一个无向图是欧拉图,当且仅当该图所有顶点度数都是偶数。 一个有向图是欧拉图,当且仅当该图所有顶点度数都是0。 有向图存在欧拉回路的充要条件:基图(把所有有向边变成无向边以后得到的图)连通,且每个点的出度等于入度。 所以求混合图的关键是:判断能否存在一个定向,使得每个节点的入度等于出度。 建图过程。 在原图中,首先给每条无向边任意定向,构成一个有向图,计算每个点的度deg,入度为正,出度为负,如果某个点的deg为奇数,显然不存在欧拉回路。由于原来的有向边,不能更改方向,无用,删了,对原图中的无向边定向后构成的有向图,如果点 i 到j 有一条弧,弧< i , j >容量加1(i 到 j 有多条边的时候,即有重边,可以一条边,多容量代替) 增加源点S,汇点T,对于每个点 i ,如果deg < 0,即出度大于入度,从S引一条弧到 i ,容量为(- deg ) / 2;如果deg > 0, 即入度大于出度,从 i