三元环:在数集中求有多少个三元子集中的元素两两互质

2.14在杭二参加集训,校园好美!!!QAQ

杜教在下午为大家做了上午三题的讲解和一些CF杂题的选讲,其中有在图上求所有三元环的算法。这个算法不是很复杂,但还是蛮有趣的啦QWQ

我们已有一些整数,记作a1,a2,...,an。我们希望求出这些数中有多个含有三个元素的子集满足题目的条件,即{ai,aj,ak}中(ai,aj)=1且(ai,ak)=1且(aj,ak)=1。

第一步,建图。将a1,a2,...an分别作为编号为1,2,...,n的点处理,且如果ai和aj互质,那么结点i和结点j之间建立一条无向边。

第二步,排序。将每个节点的度数按一定顺序排序(比如,从大到小),之后根据得到的排序将无向图调整为有向图(比如,边的方向定为从度数高的结点指向度数低的)。这样操作可以避免一下的情况:i->j->k->i。出现的情况是这的:i->j->k<-i。

第三步,枚举。先确定结点i,枚举两条i出发的边,假设分别指向j,k。若j和k之间存在边,则说明i,j,k构成了三元环,即ai,aj,ak是满足题目条件的。如此枚举便可以做到不重不漏哦。

算法的时间复杂度可以分情况证明,为O((2m)^(3/2))。

时间: 2024-10-29 19:08:07

三元环:在数集中求有多少个三元子集中的元素两两互质的相关文章

HDU3240-Counting Binary Trees(Catalan数+求逆元(非互质))

Counting Binary Trees Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 564    Accepted Submission(s): 184 Problem Description There are 5 distinct binary trees of 3 nodes: Let T(n) be the number

【欧拉函数】(小于或等于n的数中与n互质的数的数目)

[欧拉函数] 在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler's totient function.φ函数.欧拉商数等. 例如φ(8)=4,因为1,3,5,7均和8互质. 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明. [证明]: 设A, B, C是跟m, n, mn互质的数的集,据中国剩余定理,A*B和C可建立一一对应的关系.因此φ(n)的值使用算术基本定理便知, 若 n= ∏p^(α(下标p))p|

Gym - 100342J Triatrip (bitset求三元环个数)

https://vjudge.net/problem/Gym-100342J 题意:给出一个邻接矩阵有向图,求图中的三元环的个数. 思路: 利用bitset暴力求解,记得最后需要/3. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #incl

Gym - 100342J:Triatrip(Bitset加速求三元环的数量)

题意:求有向图里面有多少个三元环. 思路:枚举起点A,遍历A可以到的B,然后求C的数量,C的数量位B可以到是地方X集合,和可以到A的地方Y集合的交集(X&Y). B点可以枚举,也可以遍历.(两种都试过,区别不大.) 枚举代码: #include<cstdio> #include<bitset> #include<cstdlib> #include<cstring> #include<iostream> #include<algori

求N!中末尾有多少个0

分析: 对N进行质因数分解 N=2^x * 3^y * 5^z...,由于10 = 2*5,所以末尾0的个数只和x与z有关,每一对2和5相乘可以得到一个10,于是末尾0的个数=min(x,z).在实际中x是远远大于z的,所以我们只要求出z的值即可. 根据公式 z = N/5 + N/5^2 + N/5^3+...+N/5^k 这表明,5的倍数贡献了一个5,5^2的倍数又贡献了一个5.... 比如:25其实是贡献了2个5,但是在N/5中已经贡献了一个,所以在N/5^2中再贡献一个:同样,125在N

HDOJ-2222(AC自动机+求有多少个模板串出现在文本串中)

Keywords Search HDOJ-2222 本文是AC自动机的模板题,主要是利用自动机求有多少个模板出现在文本串中 由于有多组输入,所以每组开始的时候需要正确的初始化,为了不出错 由于题目的要求是有多少字符串出现过,而不是出现过多少次,所以出现过的模板串就不能再计数了,所欲需要置-1. 不要忘记build函数应该在insert函数之后调用,也不要忘记调用. //AC自动机,复杂度为O(|t|+m),t表示文本串的长度,m表示模板串的个数 #include<iostream> #incl

无向图求三元环

http://acm.xidian.edu.cn/problem.php?id=1187 问题重述:给一个无向图,求其中包含 3 个结点的环的个数. 题解 暴力玄学,枚举边然后双指针扫描两个端点的邻集.注意用结点的顺序 关系去重,最后除以 3 会超时的.时间复杂度应该是 O(nm),不知道怎么过的. 网上 O(m√m) 的反而过不了. 注意如何避免除以三的遍历方式. 1 #include<cstdio> 2 #include<cstring> 3 #include<algor

Codeforces Gym 100342J Problem J. Triatrip 求三元环的数量 bitset

Problem J. Triatrip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/attachments Description The travel agency “Four Russians” is offering the new service for their clients. Unlike other agencies that only suggest one-way

三元环HDU 6184

HDU - 6184 C - Counting Stars 题目大意:有n个点,m条边,问有一共有多少个‘structure’也就是满足V=(A,B,C,D) and E=(AB,BC,CD,DA,AC)这样一个图形,类似于四边形中间连接了一条对角线. 如果我们把这个四边形拆分的话,其实就是两个共用一条边的三角形,而在图中就是三元环.求三元环有两种求法,个人感觉这个三元环的时间复杂度很玄学. 第一种一种就是枚举点x,然后枚举和点x相连的y,这时根据y的度,如果y的度小于等于sqrt(m),那么我