codechef Sum of Cubes 图论
正解:图论+数学
解题报告:
然后放下题目大意?就说给定简单图,无自环或重边,然后求(∑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 图论的更多相关文章
- CodeChef Sum of distances(分治)
CodeChef Sum of distances(分治) 题目大意 有一排点,每个点 i 向 \(i + 1, i + 2, i + 3\) 分别连价值为 \(a_i,b_i,c_i\) 的有向边, ...
- Codechef SUMCUBE Sum of Cubes 组合、三元环计数
传送门 好久没有做过图论题了-- 考虑\(k\)次方的组合意义,实际上,要求的所有方案中导出子图边数的\(k\)次方,等价于有顺序地选出其中\(k\)条边,计算它们在哪一些图中出现过,将所有方案计算出 ...
- C. Sum of Cubes
原题链接 https://codeforces.com/problemset/problem/1490/C 题目 题意 如果一个数 n = x3 + y3 (x, y可以相等, 且> 0) 输出 ...
- HOJ题目分类
各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...
- 【ruby】ruby基础知识
Install Ruby(安装) For windows you can download Ruby from http://rubyforge.org/frs/?group_id=167 for L ...
- 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 ...
- C++传递函数指针
函数指针是一个很好的类型.因此,您可以编写一个函数,它的一个参数是一个函数指针.然后.在(外部)当函数使用的函数指针参数,来间接调用时调用相应的参数的函数的函数. 因为指针在不同的情况下能够指向不同的 ...
- POJ 2209 The King(简单贪心)
The King Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7499 Accepted: 4060 Descript ...
- [Scala] [Coursera]
Week 1 Cheat Sheet Link Evaluation Rules Call by value: evaluates the function arguments before call ...
随机推荐
- Java知多少(93)鼠标事件
鼠标事件的事件源往往与容器相关,当鼠标进入容器.离开容器,或者在容器中单击鼠标.拖动鼠标时都会发生鼠标事件.java语言为处理鼠标事件提供两个接口:MouseListener,MouseMotionL ...
- Python之保存和读取字典
import pickle def save_obj(obj, name ): with open('obj/'+ name + '.pkl', 'wb') as f: pickle.dump(obj ...
- Mysql 导入导出csv 中文乱码
这篇文章介绍了Mysql 导入导出csv 中文乱码问题的解决方法,有需要的朋友可以参考一下 导入csv: load data infile '/test.csv' into table table ...
- C#基础回顾:正则表达式-转
写在前面:本文根据笔者的学习体会结合相关书籍资料对正则表达式的语法和使用(C#)进行基本的介绍.适用于初学者. 摘要:正则表达式(Regular Expressions),相信做软件开发的朋友或多或少 ...
- Oracle清理回收站的方法
原文链接:http://blog.itpub.net/18841027/viewspace-1057765/ purge DBA_RECYCLEBIN用于删除Oracle数据库回收站的所有数据,需要s ...
- swoole消息推送
socket.php // 注释的部分是学习的笔记 <?php //创建websocket服务器对象,监听0.0.0.0:9502端口 $ws = ); //监听WebSocket连接打开事件 ...
- JavaScript隐藏的坑一,隐式调用toString
最近在重新学习JavaScript,看动态原型对象的时候,打印了两个用同一个构造函数生成的对象,但是打印结果却不一样,请看代码: var box1=new Box(); console.log(box ...
- C# Linq删除父级的同时删除子级
之前使用Include获取外键对象列表后,进行删除,一直报错操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null...后面还有一串.尝试了几种方式,比如将u.AlbumList=null ...
- 十三、K3 WISE 开发插件《SQL语句WHERE查询-范围查询/模糊查询》
0.存储过程开头变量定义 ), --单据起始日期 ), --单据截止日期. ), ), ), ), ) @FType varchar(50), --单据类型@FBillNo varchar(50), ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验四:按键模块③ — 单击与双击
实验四:按键模块③ - 单击与双击 实验三我们创建了"点击"还有"长点击"等有效按键的多功能按键模块.在此,实验四同样也是创建多功能按键模块,不过却有不同的有效 ...