uoj37 主旋律
标程:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<bitset>
using namespace std;
typedef long long ll;
const int mod=1e9+;
const int N=;
int read()
{
int x=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*f;
}
int n,m,Max,pop[N],pow[N],sum_e[N],to_e[N],f[N],a,b,e[N],ie[N],u[N];
int lowbit(int x){return x&(-x);}
int main()
{
n=read();m=read();
for (int i=;i<=m;i++)
{
a=read(),b=read();
e[<<a-]|=<<b-,ie[<<b-]|=<<a-;
}
Max=<<n;pow[]=;
for (int i=;i<Max;i++) pop[i]=pop[i>>]+(i&),pow[i]=(ll)pow[i-]*%mod;
for (int i=;i<Max;i++)
{
int v=lowbit(i);int p=i^v;
sum_e[i]=sum_e[i^v]+pop[e[v]&i]+pop[ie[v]&i];
f[i]=pow[sum_e[i]];to_e[i]=;
for (int j=p;j;j=(j-)&p)
u[i]=((ll)u[i]-(ll)f[i^j]*u[j]%mod+mod)%mod;
for (int j=i;j;j=(j-)&i)
{
int v=lowbit(i^j);to_e[j]=to_e[j|v]-pop[e[v]&(i^j)]+pop[ie[v]&j];
f[i]=((ll)f[i]-(ll)pow[sum_e[i^j]+to_e[j]]*u[j]%mod+mod)%mod;
}
u[i]=((ll)u[i]+f[i])%mod;
}
printf("%d\n",f[Max-]);
return ;
}
技巧:用lowbit(i)取出i中的任意一个元素(注意是移位<<后的)。
题解:状压枚举子集+容斥dp
乍一看只知道状压。。。强联通是什么鬼嘛。。。
考虑一个不强联通的图,至少有一个点的入度为0。
这样就可以容斥啦:全集-不强连通的图数=强联通的图数。
枚举缩点后入度为0的块有多少个,设包含入度为0的块的集合为T。f[S]表示S集合中的点构成强联通图的方案数,g[S][k]表示将S集合分成k个独立块的方案数,u[S][k]表示带容斥系数的g之和。e(S)表示S点集中的边数。e(S,T)表示从S中的点连出向T的边数。

u[S]也可以通过容斥求得。为了不算重,取一个S集中的点v作为连通块部分的必选点。(减号就相当于是连通块个数+1,(-1)^k变号)


求u和f的时间复杂度都是O(n^3)。求e(S)和e(S,T)都可以通过在子集上累加的方法计算。
uoj37 主旋律的更多相关文章
- bzoj3812&uoj37 主旋律
正着做不好做,于是我们考虑反着来,如何计算一个点集s的答案呢,一定是所有的方案减去不合法的方案,不合法的方案一定是缩完点后是一个DAG,那么就一定有度数为0的scc,于是我们枚举s的子集,就是说这些点 ...
- UOJ37. 【清华集训2014】主旋律
http://uoj.ac/problem/37 题解 题目是让我们求出有多少个边集可以使这张图强连通. 先补集转化一下,求这张图不强连通的方案数. 我们考虑这样的图缩完点之后的情况,既然不强连通,那 ...
- bzoj 3812: 主旋律 [容斥原理 状压DP]
3812: 主旋律 题意:一张有向图,求它的生成子图是强连通图的个数.\(n \le 15\) 先说一个比较暴力的做法. 终于知道n个点图的是DAG的生成子图个数怎么求了. 暴力枚举哪些点是一个scc ...
- 【BZOJ 3812】 3812: 主旋律 (容斥原理**)
3812: 主旋律 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 235 Solved: 196 Description 响应主旋律的号召,大家决定 ...
- BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)
这道题跟另一道题很像,先看看那道题吧 巨神兵(obelisk) 题面 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张 ...
- 清华集训2014 day1 task2 主旋律
题目 这可算是一道非常好的关于容斥原理的题了. 算法 好吧,这题我毫无思路,直接给正解. 首先,问题的正面不容易求,那么就求反面吧: 有多少种添加边的方案,使得这个图是DAG图(这里及以下所说的DAG ...
- UOJ#37. 【清华集训2014】主旋律
题目大意: 传送门 题解: 神题……Orz. 首先正难则反. 设$f_S$表示选取点集状态为s时,这部分图可以构成非强联通图的方案数. 设$p_{S,i}$表示点集s缩点后有i个入度为0点的方案数,保 ...
- BZOJ3812 主旋律(状压dp+容斥原理)
设f[S]为S点集是SCC的方案数.考虑通过去掉不合法方案转移.可以枚举入度为0的SCC所含点集S',这样显然S^S'内部的边和由S'连向S^S'的边删还是不删任选.但是这样无法保证S'包含所有入度为 ...
- BZOJ3812主旋律
/* 这道题其实没有看懂 所以整理一下吧 首先思想转化成所有方案减去不强联通的方案 不强联通的方案相当于很多强联通分量缩点后的dag 转化成子问题, 问很多点的dag方案数 然后枚举作为出度为0的点集 ...
随机推荐
- C++之STL(标准模板库)
STL:standard Template Lib 一.vector <1> 特点 <2> 常用函数: <3> 遍历方法: 1.for循环 2.迭代器 <4& ...
- Java-Class-I:java.util.Map
ylbtech-Java-Class-I:java.util.Map 1.返回顶部 1.1. import java.util.HashMap; import java.util.Map; 1.2. ...
- 关于idea中,web项目启动tomcat,访问资源报错404
背景: web项目启动tomcat,访问相应的资源,报错404,前提资源路径是没错的. 原因: 1.确定是不是web项目 不是的话: 配置web-inf的路径和webroot(web根目录)的路径 2 ...
- sql基础学习
学习参考网站:http://www.runoob.com/sql/sql-tutorial.html 一.SQL命令 1.SELECT 语句 用于从数据库中选取数据. select column_na ...
- Cortex-M3的异常/中断屏蔽寄存器组
转自 1. Cortex-M3的异常/中断屏蔽寄存器组 注:只有在特权级下,才允许访问这3个寄存器. 名 字 功能描述 PRIMASK 只有单一比特的寄存器.置为1后,就关掉所有可屏蔽异常,只剩下NM ...
- Codeforces 1167C - News Distribution
题目链接:http://codeforces.com/problemset/problem/1167/C 题意:大概就是分成几个小团体,给每个人用1 - n编号,当对某个人传播消息的时候,整个小团体就 ...
- 从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1)
从数组中任意取出2个数,判断他们的和是否为输入的数字sum,时间复杂度为0(n^2),空间复杂度0(1) 假设数据已经是排序好的 #include <stdio.h> #include & ...
- java-day17
软件结构:C/S客户端和服务器结构,B/S浏览器和服务器结构 网络通信协议 TCP:传输控制协议,面向连接的通信协议,即传输数据之前,发送端和接收端建立逻辑连接,然后再传输数据. 三次握手 UDP:用 ...
- 22-Ubuntu-文件和目录命令-移动文件和目录-mv
mv 可以用来移动文件或目录,也可以给文件或目录重命名. 选项 含义 -i 覆盖文件前提示 1.移动文件和目录 1-1移动文件 例: 将当前目录下的123.txt文件移动到~/桌面/b/e目录下 mv ...
- amaze UI(mark)
为移动而生 Amaze UI 以移动优先(Mobile first)为理念,从小屏逐步扩展到大屏,最终实现所有屏幕适配,适应移动互联潮流. 组件丰富,模块化 Amaze UI 含近 20 个 CSS ...