传送门


好久没有做过图论题了……

考虑\(k\)次方的组合意义,实际上,要求的所有方案中导出子图边数的\(k\)次方,等价于有顺序地选出其中\(k\)条边,计算它们在哪一些图中出现过,将所有方案计算出来的答案加起来。

对于\(k\)条边来说,如果它们占据了\(x\)个点,那么它们就会出现在\(2^{n-x}\)张图中。

那么\(k=1\)答案显然是\(m \times 2^{n-2}\)

\(k=2\)时有\(3\)种情况:①两条边重合,等价于\(k=1\);②两条边不重合但共一个顶点,对于一条边\((s,t)\),这种情况的出现的次数为\(d_s + d_t - 2\);③两条边不重合且不共顶点,等于\(M^2\)减上面两种情况的出现次数。

\(k=3\)时情况比较多:①三条边重合,等价于\(k=1\);②其中有一对边重合,等价于\(k=2\);③三元环,使用三元环计数计算;

④三条边共占据\(4\)个点:有\(A \rightarrow B \rightarrow C \rightarrow D\)和\(A \rightarrow B , A \rightarrow C , A \rightarrow D\)两种情况。第一种情况可以枚举\(BC\)边,那么出现次数就是\((d_B - 1) \times (d_C - 1)\),注意有可能出现\(AD\)共点形成三元环的情况,所以在最后需要减掉\(3 \times\)三元环个数;第二种情况直接枚举点\(A\)。

⑤三条边共占据\(5\)个点,即\(A \rightarrow B \rightarrow C , D \rightarrow E\)的情况。可以枚举\(B\),那么方案数就是\(d_B(d_B - 1)(M - 2)\)。注意在这个时候会有③和④的情况重算,记得减掉。

⑥三条边两两没有共顶点,这个就是$M^3 - $①②③④⑤

三元环计数求一下③这道题就做完了。时间复杂度\(O(M \sqrt{M})\)。注意④⑤中重算部分的系数。

下面的代码里\(k=3\)的情况③④⑤⑥都是算的无序的;可能上面的描述里有序和无序有混淆,麻烦注意。

#include<bits/stdc++.h>
using namespace std; inline int read(){
int a = 0;
char c = getchar();
while(!isdigit(c)) c = getchar();
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return a;
} #define int long long
const int MAXN = 1e5 + 7 , MOD = 1e9 + 7;
int N , M , K , s[MAXN] , t[MAXN] , in[MAXN] , pow2[MAXN]; inline int poww2(int b){return b < 0 ? 0 : pow2[b];} inline int poww(int a , int b){
int times = 1;
while(b){
if(b & 1) times = times * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return times;
} namespace solve1{
int main(){return poww2(N - 2) * M % MOD;}
} namespace solve2{
int main(){
int ans = solve1::main();
for(int i = 1 ; i <= M ; ++i){
ans = (ans + (in[s[i]] + in[t[i]] - 2) * poww2(N - 3) + (M - 1 - (in[s[i]] + in[t[i]] - 2)) * poww2(N - 4)) % MOD;
}
return ans;
}
} namespace solve3{
int col[MAXN];
vector < int > ch[MAXN]; int calc3(){
int cnt = 0;
for(int i = 1 ; i <= M ; ++i)
if(in[s[i]] < in[t[i]] || (in[s[i]] == in[t[i]] && s[i] < t[i]))
ch[s[i]].push_back(t[i]);
else ch[t[i]].push_back(s[i]);
for(int i = 1 ; i <= N ; ++i){
for(auto p : ch[i]) col[p] = i;
for(auto p : ch[i])
for(auto q : ch[p])
if(col[q] == i) ++cnt;
}
return cnt % MOD;
} int main(){
int ans = solve2::main() , tmp = solve1::main();
ans = ((ans - tmp + MOD) * 3 + tmp) % MOD;
int cnt3 = calc3() , cnt4 = MOD - cnt3 * 3 % MOD , cnt5 = 0 , cnt6 = 0;
for(int i = 1 ; i <= N ; ++i)
cnt4 = (cnt4 + in[i] * (in[i] - 1) * (in[i] - 2) / 6) % MOD;
for(int i = 1 ; i <= M ; ++i)
cnt4 = (cnt4 + (in[s[i]] - 1) * (in[t[i]] - 1)) % MOD;
cnt5 = MOD - (cnt4 * 2 + cnt3 * 3) % MOD;
for(int i = 1 ; i <= N ; ++i)
cnt5 = (cnt5 + MOD - in[i] * (in[i] - 1) * (in[i] - 2) / 6 % MOD) % MOD;
for(int i = 1 ; i <= N ; ++i)
cnt5 = (cnt5 + in[i] * (in[i] - 1) * (M - 2) / 2) % MOD;
cnt6 = (M * (M - 1) * (M - 2) / 6 - cnt5 - cnt4 - cnt3) % MOD;
return (ans + 6 * (cnt3 * poww2(N - 3) + cnt4 * poww2(N - 4) + cnt5 * poww2(N - 5) + cnt6 * poww2(N - 6))) % MOD;
}
} signed main(){
pow2[0] = 1;
for(int i = 1 ; i <= 100000 ; ++i)
pow2[i] = (pow2[i - 1] << 1) % MOD;
for(int T = read() ; T ; --T){
N = read(); M = read(); K = read();
memset(in , 0 , sizeof(int) * (N + 1));
memset(solve3::col , 0 , sizeof(int) * (N + 1));
for(int i = 1 ; i <= N ; ++i)
solve3::ch[i].clear();
for(int i = 1 ; i <= M ; ++i){
s[i] = read(); t[i] = read();
++in[s[i]]; ++in[t[i]];
}
if(K == 1) cout << solve1::main() << endl;
else if(K == 2) cout << solve2::main() << endl;
else cout << solve3::main() << endl;
}
return 0;
}

Codechef SUMCUBE Sum of Cubes 组合、三元环计数的更多相关文章

  1. 【BZOJ5332】[SDOI2018]旧试题(数论,三元环计数)

    [BZOJ5332][SDOI2018]旧试题(数论,三元环计数) 题面 BZOJ 洛谷 题解 如果只有一个\(\sum\),那么我们可以枚举每个答案的出现次数. 首先约数个数这个东西很不爽,就搞一搞 ...

  2. loj#6076「2017 山东一轮集训 Day6」三元组 莫比乌斯反演 + 三元环计数

    题目大意: 给定\(a, b, c\),求\(\sum \limits_{i = 1}^a \sum \limits_{j = 1}^b \sum \limits_{k = 1}^c [(i, j) ...

  3. BZOJ.5407.girls/CF985G. Team Players(三元环计数+容斥)

    题面 传送门(bzoj) 传送门(CF) \(llx\)身边妹子成群,这天他需要从\(n\)个妹子中挑出\(3\)个出去浪,但是妹子之间会有冲突,表现为\(i,j\)之间连有一条边\((i,j)\), ...

  4. LOJ2565 SDOI2018 旧试题 莫比乌斯反演、三元环计数

    传送门 这道题的思路似乎可以给很多同时枚举三个量的反演题目提供一个很好的启发-- 首先有结论:\(d(ijk) = \sum\limits_{x|i}\sum\limits_{y|j}\sum\lim ...

  5. [hdu 6184 Counting Stars(三元环计数)

    hdu 6184 Counting Stars(三元环计数) 题意: 给一张n个点m条边的无向图,问有多少个\(A-structure\) 其中\(A-structure\)满足\(V=(A,B,C, ...

  6. HDU 6184 Counting Stars 经典三元环计数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6184 题意: n个点m条边的无向图,问有多少个A-structure 其中A-structure满足V ...

  7. HDU6184【Counting Stars】(三元环计数)

    题面 传送门 给出一张无向图,求 \(4\) 个点构成两个有公共边的三元环的方案数. 题解 orz余奶奶,orz zzk 首先,如果我们知道经过每条边的三元环个数\(cnt_i\),那么答案就是\(\ ...

  8. FJWC2019 子图 (三元环计数、四元环计数)

    给定 n 个点和 m 条边的一张图和一个值 k ,求图中边数为 k 的联通子图个数 mod 1e9+7. \(n \le 10^5, m \le 2 \times 10^5, 1 \le k \le ...

  9. hdu6184 Counting Stars 【三元环计数】

    题目链接 hdu6184 题解 题意是让我们找出所有的这样的图形: 我们只需要求出每条边分别在多少个三元环中,记为\(x\),再然后以该点为中心的图形数就是\({x \choose 2}\) 所以我们 ...

随机推荐

  1. Android tabLayout+recyclerView实现锚点定位

    原文链接:https://mp.weixin.qq.com/s/L3o2i3WTmg1ScXEYDS8YCg 在上一篇文章 Android 实现锚点定位中,我们介绍了tablayout+scrollV ...

  2. Python3.6 下 安装MySql

    https://pypi.python.org/pypi/mysqlclient/1.3.10 该网页下下载 Python-3.5及上版本的扩展的mysql驱动. 下载的是一个.whl文件,下载目录为 ...

  3. 关于Linux安装Mono 3.4的bug

    网上可以找到中文的办法,但作者提供了一个完整版下载.麻烦再下载不说,安全问题也得不到保障.其实解决办法很简单. 问题描述:进入mono源码目录,配置后make,然后make install,但是提示缺 ...

  4. JAVA项目从运维部署到项目开发(二.ZooKeeper)

    一.zookeeper的相关介绍 点击查看 二.下载.安装与配置 1.ZooKeeper官网下载地址(点击跳转),当前稳定版本为V3.4.12.Liniux下可以在指定目录,使用wget命令下载. h ...

  5. Linux 网卡聚合

    Linux 网卡聚合的类型: 1.broadcast:传输来自所有端口的每个包 2.roundrobin:以轮播方式传输来自每个端口的包 3.activebackup:故障转移运行程序,监视更改并选择 ...

  6. MyBatis笔记----MyBatis 入门经典的两个例子: XML 定义与注解定义

    ----致敬MyBatis官方开放文档让大家翻译,不用看书直接看文档就行了,mybatis的中文文档还需要完备的地方 简介 什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以 ...

  7. 自动化测试基础篇--Selenium中JS处理滚动条

    摘自https://www.cnblogs.com/sanzangTst/p/7692285.html 前言 什么是JS? JS就是JavaScript: JavaScript 是世界上最流行的脚本语 ...

  8. 【MM系列】SAP里批量设置采购信息记录删除标记

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP里批量设置采购信息记录删除标记 ...

  9. js在前端json字符串和对象互相转化

    js在前端json字符串和对象互相转化 //对象转json串 注意:参数必须是对象,数组不起作用,对象格式{'0'=>'a'} JSON.stringify( arr ); //json字符串转 ...

  10. Metasploit渗透测试实际应用

    Metasploit:如何在 Metasploit 中使用反弹 Shell https://xz.aliyun.com/t/2380 Metasploit:如何使用 msfvenom https:// ...