题目大意:

  传送门

题解:

  神题……Orz。

  首先正难则反。

  设$f_S$表示选取点集状态为s时,这部分图可以构成非强联通图的方案数。

  设$p_{S,i}$表示点集s缩点后有i个入度为0点的方案数,保证$i<|S|$。

  设$e[S,T]$表示从S集合到T集合的边数。

  很显然有

  好吧,并不显然……还是来解释一下……

  考虑求$f_S$,我们知道缩点后必然会有一些点环的入度为0,但数量并不确定,我们强制性的让一部分图构成一部分缩点后为i个入度为0的子图。然后将这部分图随意连向剩余子图,至于剩余子图内部也可以随便连。但是显然当$T==S$时,我们需要让被选择的图缩点后至少要有2个入度为0的点。

  然后这个东西显然(这次是真的)是会重的,为了去重,我们使用容斥原理,这样我们就得到了上面这玩意。

  问题是这东西怎么求……

  我们设

  值得注意的会发现$g_S$和其他子图不太一样(缩点后有至少两个入度为0的点?)……

  我们先想这东西怎么搞……

  先假设已经知道$T\neq S$的$g$值。

  那么考虑当我们枚举到$T==S$时,由于我们已经将两部分图中连边的方案容斥完了(因为$T==S$时,T不可能再向$S-T$连边)。那么还剩下的就是两部分图中不连边的方案还没有容斥完。(请注意是两部分)

  为了满足容斥,$g_S$此时应该记录的是分成若干个联通块以后没有边的方案数。

  这样的话就会导致一个问题$g_S$对于$f_S$和$f_S+I,I\cap S \neq |I|$的意义是不一样的。但$S+I$太遥远了,我们先考虑对于S的意义该怎么算。

  我们还是可以枚举$S$的子集,我们会得到$g_S=-\sum_T g_T * (2^{e[S-T,S-T]}-f_{S-T})$即我们强制一部图为一个强联通分量,另外一部分图我们使其数量任意。为了使其构成我们想要的意义,那么我们强行不让他们连边。这样我们$S$相对与$T$就多了一个强联通分量,故要乘上$-1$。

  但这样会出现一个问题,就是我们必然会算重。比如$g_T$中是包含缩成1个点的方案的,$S-T$我们又让它缩成了1个点,这样我们比如会重复计算。当然出重的不只这些。

  那么为了避免出现这种情况,同时枚举时必然是两个非空子集。那我们就强制让一个点划分到一部分子集里。这样我们就可以解决这个问题了。

  回来考虑$g_S$对$S+I$该怎么算,我们注意到他们之间的区别是当对于$S$时,我们要求分成至少两个强联通分量,而$S-T$时则可以只有1个,那么我们直接给$g_S$加上$2^{e[S,S]-f_S}$不就完事了。

  真难表述……(辣鸡linux没有仿宋字体,看得好难受

代码:

 #include "bits/stdc++.h"

 using namespace std;

 inline int read(){
int s=,k=;char ch=getchar();
while (ch<''|ch>'') ch=='-'?k=-:,ch=getchar();
while (ch>&ch<='') s=s*+(ch^),ch=getchar();
return s*k;
} const int N=,M=<<N,mod=1e9+; int n,m,S;
int edge[M],num[M],bin[N*N],f[M],g[M],e[M],redge[M],w[M],lgs[M]; int main(){
//freopen(".in","r",stdin);
//freopen("vio.out","w",stdout);
register int i,j,k,res;
n=read(),m=read();
for (i=;i<=m;++i) {
j=read(),k=read();
edge[<<j-]^=<<k-;
redge[<<k-]^=<<j-;
}
for (i=bin[]=;i<=m;++i) j=(bin[i-]<<),j<mod?bin[i]=j:bin[i]=j-mod; for (S=<<n,i=;i^S;++i) num[i]=num[i>>]+(i&);
for (i=,lgs[]=-;i^S;++i) lgs[i]=lgs[i>>]+;
for (i=;i^S;++i) j=bin[lgs[i]],e[i]=e[i^j]+num[redge[j]&(i^j)]+num[edge[j]&(i^j)];
for (i=;i<S;++i) {
k=i&-i,res=i^k;
for (j=res&res-;j;j=j-&res) {
g[i]+=1ll*g[res^j]*(bin[e[j^k]]-f[j^k]+mod)%mod;
g[i]<mod?:g[i]-=mod;
}
if (num[i]>) g[i]+=g[res],g[i]<mod?:g[i]-=mod;
g[i]=g[i]?mod-g[i]:;
for (j=res;j;j=j-&i) {
k=bin[lgs[i^j]];
w[i^j]=w[i^j^k]+num[redge[k]&j]-num[edge[k]&(i^j^k)];
f[i]+=1ll*bin[e[i^j]+w[i^j]]*g[j]%mod;
f[i]<mod?:f[i]-=mod;
}
f[i]+=g[i];
f[i]<mod?:f[i]-=mod;
g[i]+=(bin[e[i]]-f[i]+mod)%mod;
g[i]<mod?:g[i]-=mod;
}
printf("%d\n",(bin[m]-f[S-]+mod)%mod);
return ;
}

UOJ#37. 【清华集训2014】主旋律的更多相关文章

  1. 【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理

    题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果. 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum ...

  2. 【UOJ#37】 [清华集训2014] 主旋律

    题目链接 题目描述 给定一张强联通图,求有多少种边的存在情况满足图依然强联通. \(n\leq15\) Sol 首先正难则反,考虑用总数减去不强联通的. 考虑一张不强联通的图,缩点后一定是一个 DAG ...

  3. uoj #46[清华集训2014]玄学

    uoj 因为询问是关于一段连续区间内的操作的,所以对操作构建线段树,这里每个点维护若干个不交的区间,每个区间\((l,r,a,b)\)表示区间\([l,r]\)内的数要变成\(ax+b\) 每次把新操 ...

  4. UOJ.41.[清华集训2014]矩阵变换(稳定婚姻)

    题目链接 稳定婚姻问题:有n个男生n个女生,每个男/女生对每个女/男生有一个不同的喜爱程度.给每个人选择配偶. 若不存在 x,y未匹配,且x喜欢y胜过喜欢x当前的配偶,y喜欢x也胜过y当前的配偶 的完 ...

  5. bzoj 3816&&uoj #41. [清华集训2014]矩阵变换

    稳定婚姻问题: 有n个男生,n个女生,所有女生在每个男生眼里有个排名,反之一样. 将男生和女生两两配对,保证不会出现婚姻不稳定的问题. 即A-1,B-2 而A更喜欢2,2更喜欢A. 算法流程: 每次男 ...

  6. BZOJ3812 清华集训2014 主旋律

    直接求出强联通生成子图的数量较难,不妨用所有生成子图的数量减去非强联通的. 非强联通生成子图在所点后满足编号最小的点所在的强联通分量不是全集. 由于$n$很小,我们可以考虑状态压缩. 对于点集$S$, ...

  7. uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题

    [清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出 ...

  8. AC日记——【清华集训2014】奇数国 uoj 38

    #38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘 ...

  9. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

  10. UOJ#46. 【清华集训2014】玄学

    传送门 分析 清华集训真的不是人做的啊嘤嘤嘤 我们可以考虑按操作时间把每个操作存进线段树里 如果现在点x正好使一个整块区间的右端点则更新代表这个区间的点 我们不难发现一个区间会因为不同的操作被分成若干 ...

随机推荐

  1. 小dai浅谈通信网络(一)——引子

    说起通信网络,首先来看一个场景: 场景模式: 小明和小刚在闹市碰面. 小明对小刚大声喊道:"小刚,你好啊!" 小刚摇手答到:"你好,小明!" 就这么几句简单的话 ...

  2. JAVA物联网九大核心热点技术

    1. Unix/Linux平台技术: Unix系统原理.Unix常用命令.Shell编程.  2. Java EE核心技术: Java语言核心.Java高级API.JVM及性能优化.Java Secu ...

  3. java垃圾回收总结(2)

    java垃圾回收总结(2)   上一篇文章 介绍了jvm虚拟机运行时内存结构以及如何标识需要回收的对象,这一节主要讲解垃圾回收的基本算法. 基本上 jvm内存回收有三种 基本算法 标记-清除 标记清除 ...

  4. (转)go rabbitmq实践

    转载自:http://www.cnblogs.com/shi-meng/p/4800080.html 1:驱动 本来打算自己写一个驱动的,后来发现github上面已经有了,那我就直接拿现成的了, 驱动 ...

  5. What’s new in Channels 2 摘译

    最近准备在一个老Django项目上启用Channels,Channels于今年2月2日发布2.0版本,这个版本包含很多不向前兼容的特性,为了新特性调研的需要,也为了方便社区,我新版本的What's N ...

  6. (原创)ubuntu 10.04+ruby1.9.2+rails3 安装记录

    第一步当然是现在ruby 1.9.2 的sourcecode了,因为现在的ubuntu 源中还没有1.9.2的版本 我下载的是ruby-1.9.2-p290.tar.gz 然后解压到/usr/loca ...

  7. Spring 下 MyBatis 的基本使用

    参看代码 GitHub : pom.xml dbconfig.properties DbConfig.java MySqlBean.java User.java UserMapper.java Use ...

  8. Maven手动添加jar包

    有的jar在Maven中找不到则需要手动添加(如ojdbc14.jar) 方法如下: 一.将你要添加的jar包放到指定目录(在该目录下打开命令窗口) 二.输入指令:mvn install:instal ...

  9. 【转】简单了介绍js中的一些概念(词法结构) 和 数据类型(部分)。

    1 , javascript字符集: javascript采用的是Unicode字符集编码. 为什么要采用这个编码呢? 原因很简单,16位的Unicode编码可以表示地球人的任何书面语言.这是语言 国 ...

  10. ES2015也就是ES6知识点持续更新

    ES6,全名:ECMAScript2015,先扯点其他的,ECMA是一个国际标准化组织,它最重要最重要的作用就是让ECMAScript这门语言标准化,什么意思呢?我们知道,js这门脚本语言是运行在浏览 ...