正解:图论+数学

解题报告:

先放个传送门QwQ

然后放下题目大意?就说给定简单图,无自环或重边,然后求(∑e[i][j])k,i,j∈S,S为点集的子集

然后因为k的取值只有[1,3],所以这里分类讨论说下这题QAQ

首先k=1

k=1就比较简单昂,可以直接考虑每条边的贡献,所以就直接考虑如果这个边有贡献,一定是它的两个端点被选了,然后其他点随便选,所以答案就m*2n-2,做完辣

然后k=2

考虑组合意义?所以平方就相当于是说,有顺序地选两条边,求这个图包含了这两条边的方案数

那就和k=1一样的考虑,分情况讨论一下就好嘛

如果两条边是同一条边,就2n-2

如果它们有一个共同的端点,就2n-3

如果他们麻油共同的端点,就2n-4

然后就做完辣

还是说下统计边趴QAQ

首先是同一条边显然是有m种

然后有一个共同的端点可以通过枚端点,每个端点会有du[i]*(du[i]-1)的贡献

然后麻油共同的端点就是总数-同一条边的方案-有共同顶点的方案

over

最后就k=3

和k=2差不多,只是说要求的是,选三条边

然后就熟悉的分类讨论

因为考虑到不同的方案的差别主要在于是×2的几次方,也就是说只和这些边的端点个数有关,所以依然按端点数分类讨论

首先两个端点,就同一条边,一样的

三个端点,就有两条边是一条边还有一条边是和他们同端点的,或者是个三元环

四个端点,就有两条边是一条边而且第三条边不共端点或一条链或菊花图

五个端点,就两条链

六个端点,就三条边分别无交

然后三条边都同一条的情况,两条边是同一条的情况,就都比较简单,和上面那个k=2的也差不蛮多,skip

下面剩下来的就分别有

三元环

一条链

菊花图

一条链一条边

三条边分别无交

这里要安利一下,mlogm求三元环的做法,但是为了逻辑的连贯性,把这个做法的科普放到最后边QAQ

然后先分别说下其他几个的求法

首先对于一条链的,就枚举中间那条边是什么,然后另外两条边的方案数就是(du[i]-1)*(du[j]-1),但是这样可能会枚到三元环,所以要减去三元环的数量,又因为有三条边可能枚三次,所以最后的答案要减去三元环的个数*3

然后对于菊花图,就枚举那个中心的点,所以方案就是du[i]*(du[i]-1)*(du[i]-2)

然后对于两条链的,想到它肯定是一个两条边一个一条边,所以先枚举两条边的那个共同的端点,再随便枚举一条边就欧克了,但这里注意到,又是可能会枚到三元环的,然后还可能枚举到一条链,其中三元环依然是每条边被枚一次,一条链会被枚两次(就两边的边可能会被枚到嘛),所以最后的答案-三元环的个数*3-一条链的个数*2

三条边分别无交依然是总量-其他方案数就over辣

最后要解决的就,三元环的个数

这里用到的方法就,对每条边重新正式连单向边,从度数小的指向度数大的,如果度数相等就从编号小的指向编号大的

然后这里为了区分两种边,原来的边叫双向边,后来的叫单向边

就枚举双向边,然后选这个双向边的一端(具体哪一段其实是有要求的,指的是度数小的那一端,为什么我不知道但代码是这样儿的QAQ),把这一端的单向边连向的所有点染色,然后再看这个双向边的另一端的单向边指向的点,如果是这个颜色,说明是个三元环,ans++

更简单粗暴的方法可以直接开个vector,然后枚两个端点的vector,如果有相等的元素就++as,反正思想都一样儿的就是辣,只是实现上有一定的区别而已QAQ

好滴写完了

然后关于具体代码注意两个地方,一个是k=2的时候我是直接做的,但其实本来应该是要去重的就要/2的,但因为是说有顺序的,所以就又*2就抵消掉了,代码中就麻油体现出来这一步了,另一个其实是一样的,就k=3的时候要*6,我在后面一起*6了,这个点不算是要注意只是解释下为什么要*6

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define int long long
#define gc getchar()
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=1e5+,mod=1e9+;
int n,m,K,fr[N],to[N],poww[N]={},du[N],vis[N];
vector<int>nod[N]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch<'' || ch>''))ch=gc;
if(ch=='-')y=,ch=gc;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
namespace gd
{
int solve()
{
ri as1=m*m%mod,as2=,as3=m;
rp(i,,n)as2=(as2+du[i]*(du[i]-))%mod;
as1=(as1-as2+mod)%mod;as1=(as1-as3+mod)%mod;
if(n>=)as3=(as3*poww[n-]+as2*poww[n-])%mod;
if(n>=)as3=(as3+as1*poww[n-])%mod;
return as3;
}
}
namespace gs
{
int solve()
{
ri as3=,as4=,asas4=,as5=,as6=,as=;
rp(i,,n)nod[i].clear();
rp(i,,m)
{
if(du[fr[i]]>du[to[i]] || (du[fr[i]]==du[to[i]] && fr[i]>to[i]))swap(fr[i],to[i]);
nod[fr[i]].push_back(to[i]);
}
rp(i,,n)
{
for(ri j:nod[i])vis[j]=i;
for(ri j:nod[i])for(ri k:nod[j])if(vis[k]==i)as3=(as3+)%mod;
}
rp(i,,m)as4=(as4+(du[fr[i]]-)*(du[to[i]]-)%mod)%mod;as4=(as4-*as3+mod*)%mod;
rp(i,,n)asas4=(asas4+du[i]*(du[i]-)*(du[i]-)/%mod)%mod;
rp(i,,n)as5=(as5+du[i]*(du[i]-)/%mod*(m-)%mod);
as5=(as5-*as4%mod+mod)%mod;as5=(as5-*as3%mod+mod)%mod;as5=(as5-*asas4%mod+mod)%mod;
as6=m*(m-)*(m-)/%mod;as6=(as6-as5+mod-as4+mod-asas4+mod-as3+mod)%mod;
if(n>=)as=(as+as6*poww[n-]%mod)%mod;
if(n>=)as=(as+as5*poww[n-]%mod)%mod;
if(n>=)as=(as+as4*poww[n-]%mod+asas4*poww[n-]%mod)%mod;
if(n>=)as=(as+as3*poww[n-]%mod)%mod;
as=as*%mod;as=(as-*m*poww[n-]%mod+mod)%mod;as=(as+gd::solve()*%mod)%mod;
return as;
}
} main()
{
freopen("t2.in","r",stdin);freopen("t2.out","w",stdout);
int T=read();rp(i,,N-)poww[i]=(poww[i-]<<)%mod;
while(T--)
{
memset(du,,sizeof(du));memset(vis,,sizeof(vis));
n=read();m=read();K=read();
rp(i,,m)++du[fr[i]=read()],++du[to[i]=read()];
if(K==)printf("%lld\n",m*poww[n-]%mod);
if(K==)printf("%lld\n",gd::solve());
if(K==)printf("%lld\n",gs::solve());
}
return ;
}

这儿是代码QAQ

overr,我晚上补QAQ

codechef Sum of Cubes 图论的更多相关文章

  1. CodeChef Sum of distances(分治)

    CodeChef Sum of distances(分治) 题目大意 有一排点,每个点 i 向 \(i + 1, i + 2, i + 3\) 分别连价值为 \(a_i,b_i,c_i\) 的有向边, ...

  2. Codechef SUMCUBE Sum of Cubes 组合、三元环计数

    传送门 好久没有做过图论题了-- 考虑\(k\)次方的组合意义,实际上,要求的所有方案中导出子图边数的\(k\)次方,等价于有顺序地选出其中\(k\)条边,计算它们在哪一些图中出现过,将所有方案计算出 ...

  3. C. Sum of Cubes

    原题链接 https://codeforces.com/problemset/problem/1490/C 题目 题意 如果一个数 n = x3 + y3 (x, y可以相等, 且> 0) 输出 ...

  4. HOJ题目分类

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  5. 【ruby】ruby基础知识

    Install Ruby(安装) For windows you can download Ruby from http://rubyforge.org/frs/?group_id=167 for L ...

  6. E - The King

    Description Once upon a time in a country far away lived a king and he had a big kingdom. He was a v ...

  7. C++传递函数指针

    函数指针是一个很好的类型.因此,您可以编写一个函数,它的一个参数是一个函数指针.然后.在(外部)当函数使用的函数指针参数,来间接调用时调用相应的参数的函数的函数. 因为指针在不同的情况下能够指向不同的 ...

  8. POJ 2209 The King(简单贪心)

    The King Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7499   Accepted: 4060 Descript ...

  9. [Scala] [Coursera]

    Week 1 Cheat Sheet Link Evaluation Rules Call by value: evaluates the function arguments before call ...

随机推荐

  1. Pwnium CTF2014 – MatterOfCombination writeup

    这道题是虽然只有75分,但是做出来的队伍却很少,我们队伍也没有做出来,这次是看到了0xAWES0ME 的解题思路后才有了这篇文章.原文地址可以点击看这里,英文的. 题目就是一张图片: 在网上可以找到这 ...

  2. rqalpha探究 1 setup.py

    rqalpha是难得几个好的做量化交易的开源项目,不过由于自己python用的实在不多,看起来还是觉得很复杂. 因此准备抽取出框架,从最简单的搭建. 思路 从setup着手,看一下如何建立一个发布工程 ...

  3. Java 8 StampedLock解决同步问题

    Java 8新特性探究(十)StampedLock将是解决同步问题的新宠 JDK8中StampedLock原理探究 深入理解StampedLock及其实现原理 JDK1.8 StampedLock源码 ...

  4. 说说自己对RESTful API的理解

    REST不是英文上的rest单词,其英文缩写为presentational State Transfer ,直译为表现状态转移,咋看起来很学术,不懂,其实不用去死抠这个词的意思.REST是一种约束和架 ...

  5. talk is cheap, show me the code——dcgan,wgan,wgan-gp的tensorflow实现

    最近学习了生成对抗网络(GAN),基于几个经典GAN网络结构做了些小实验,包括dcgan,wgan,wgan-gp.坦率的说,wgan,wgan-gp论文的原理还是有点小复杂,我也没有完全看明白,因此 ...

  6. 自windows8以后,所有版本(专业版、企业版、旗舰版)都支持从 vhd 启动

    而在windows 7 中,只有:企业版.旗舰版: 支持 从 vhd 启动!

  7. 【Dubbo 源码解析】01_Dubbo 设计简介

    Dubbo 设计简介 Dubbo 采用 Microkernel + Plugin (微内核 + 插件)模式,Microkernel 只负责组装 Plugin,Dubbo 自身的功能也是通过扩展点实现的 ...

  8. 《精通Python网络爬虫》

    抓包工具 Fiddler 爬虫的浏览器伪装技术 Python Scrapy 框架

  9. SQL Server 端口号的使用

    SQL Server 端口号的使用 服务器地址  逗号 端口号 服务器地址,端口号 xxx.xxx.xxx.xxx,0000 www.xxx.com,1533  (1533是SQL Server 的端 ...

  10. linux如何查看某个端口是否开放

    1.你可以使用 lsof 命令来查看某一端口是否开放.查看端口可以这样来使用,我就以80端口为例: lsof -i:80 或者 lsof -i:22如果有显示说明已经开放了,如果没有显示说明没有开放 ...