3812: 主旋律

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 235  Solved: 196

Description

响应主旋律的号召,大家决定让这个班级充满爱,现在班级里面有 n 个男生。
如果 a 爱着 b,那么就相当于 a 和 b 之间有一条 a→b 的有向边。如果这 n 个点的图是强联通的,那么就认为这个班级是充满爱的。
不幸的是,有一些不好的事情发生了,现在每一条边都可能被摧毁。我作为爱的使者,想知道有多少种摧毁的方式,使得这个班级任然充满爱呢?(说人话就是有多少边的子集删去之后整个图仍然强联通。)

Input

第一行两个数 n 和 m,表示班级里的男生数和爱的关系数。
接下来 m 行,每行两个数 a 和 b,表示男生 a 爱着男生 b。同时 a 不等于 b。
所有男生从 1 到 n 标号。
同一条边不会出现两遍,但可能出现 a 爱着 b,b 也爱着 a 的情况,这是两条不同的边。

Output

输出一行一个整数,表示对 109+7 取模后的答案。

Sample Input

5 15
4 3
4 2
2 5
2 1
1 2
5 1
3 2
4 1
1 4
5 4
3 4
5 3
2 3
1 5
3 1

Sample Output

9390

HINT

对于 100% 的数据满足: n≤15,0≤m≤n(n−1)。

Source

【分析】

  此乃神题也!

  看了好久题解啊。。【想不出来还不懂。。

  嗯。。要ORZ男神。。他的题解好懂多了。

  题解都看了一天才看懂TAT。。
     考虑求出非强联通即dag的方案数用全部情况减
     注意统计dag从出度为0的点入手,这题中就是缩点后出度为0的点
     先考虑一个辣鸡做法
     若现全集为s,我们已经知道某种方案子集t会缩成k个强连通分量,这些强连通分量出入度都为0
     那么我们可以得出s至少缩成k个出度0强连通分量的一类方案数(即用t中这k个限制最小的方案)为2^x(x为s^t里的点为起点,s里的点为终点的边数)。因为这x条边的所有连     法,包括了所有缩点后有大于等于k个的方案。
        (容斥很重要的一点就是设置“至少为。。” 状态,注意“至少k状态”应包含所有“为x状态”,其中k是x的子集
  然后我们就上容斥,对于至少k个出度0的方案,当k为奇数时就减,当k为偶数时就加
  现在考虑正解
  我们枚举一个子集的某种方案,看他的出度0个数是奇还是偶太慢了
  注意对于一种方案我们关心的只是他是哪个点集,他缩完点后有奇数个出度为0还是偶数个出度为0,其中奇数时就-1,偶数时就+1
  那我们可以设g[s]表示s这个点集所有缩点成若干个强连通分量方案的贡献和,其中缩成奇数个的方案贡献-1,偶数的贡献+1
  设f[s]表示s为一个强连通方案数,s内部有h[s]条边,那么
  f[s]=2^h[s]+sigma (2^cnt) * g[t]
  t为s的子集,cnt为起点在s^t中,终点在t中的边数
  注意这一步是已经带上容斥的,因为g[t]是容斥贡献和
  然后
  g[s]=-f[t] * g[s^t] - f[s];
  其中t为包含s最小标号节点子集。g表示缩为若干个出度0强连通,t就是枚举最小标号所在强连通,这样保证情况不重不漏。前面的-代表,加入t这个强连通分量后,原来方案的强连通数奇偶取反,所以贡献正负取反。最后-f[s]就表示单独s这一个强连通分量,因为1是奇数,所以每种方案贡献是-1
  然后就做完辣owo

  一个DAG肯定由一些没有出度的点构成,那么我们可以考虑枚举没有出度的点的子集T。那么S-T中的边和S-T 到T之间的边也可以随便连。

  但是我们这样连出来不能保证S-T中没有出度为0的点(或者强联通分量)。而且有可能会重复计算。【这个要用容斥

  比如说两个出度为0的点u,v,枚举T={u}的和T={v}时都会计算u,v。 【这个我们枚举s的最小节点集就可以避免这样的重复

  g数组的意思,其实是把s分成若干个互不影响的强联通块的方案数的和,求和时要冠以符号$(-1)^t$,t表示分成了多少个强联通块。【容斥部分

  这个是方便容斥的。不然你枚举了处于T集合的点之后还要枚举强联通块慢死

  关于容斥方面。

  男神说的很好。就是,容斥重点是“至少k。。。”

  要算至少有k个出度为0,就是减掉。。。,加上。。。

  Ans=总数-非强联通个数

  非强联通即缩点后的DAG的个数>=2。

  最后只要枚举处于T集合的点,然后累加就好,因为在g数组里面考虑了容斥的正负号了。

不懂也可以看代码:

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
#define Maxn (1<<15)+10
#define N 20
#define M 410
#define Mod 1000000007
#define LL long long int ru[N],chu[N];
int pw[M],h[Maxn],w[Maxn],d[Maxn];
int g[Maxn],f[Maxn],num[Maxn]; void init(int n,int m)
{
pw[]=;for(int i=;i<=m;i++) pw[i]=1LL*pw[i-]*%Mod;
for(int i=;i<=n;i++) w[<<i-]=i,chu[i]=ru[i]=;
for(int i=;i<(<<n);i++) d[i]=d[i>>]+(i&);
} int lowbit(int x) {return x&(-x);} int main()
{
int n,m;
scanf("%d%d",&n,&m);
init(n,m);
for(int i=;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ru[y]|=<<x-;
chu[x]|=<<y-;
}
int ss=(<<n)-;
for(int i=;i<=ss;i++)
{
int x=lowbit(i),y=w[x];
h[i]=h[i^x]+d[chu[y]&i]+d[ru[y]&i];
f[i]=pw[h[i]];g[i]=; for(int j=(i-)&i;j;j=(j-)&i)
{
if(j&x) continue;
g[i]=(g[i]-1LL*g[j]*f[i^j]%Mod)%Mod;
}
for(int j=i;j;j=(j-)&i)
{
if(j==i) num[i^j]=;
else
{
x=lowbit(i^j);y=w[x];
num[i^j]=num[i^j^x]+d[chu[y]&i];
}
f[i]=(f[i]+1LL*g[j]*pw[num[i^j]]%Mod)%Mod;
}
g[i]=(g[i]-f[i])%Mod;
}
f[ss]=(f[ss]+Mod)%Mod;
printf("%d\n",f[(<<n)-]);
return ;
}

2017-04-19 19:49:29

【BZOJ 3812】 3812: 主旋律 (容斥原理**)的更多相关文章

  1. bzoj 3812: 主旋律 [容斥原理 状压DP]

    3812: 主旋律 题意:一张有向图,求它的生成子图是强连通图的个数.\(n \le 15\) 先说一个比较暴力的做法. 终于知道n个点图的是DAG的生成子图个数怎么求了. 暴力枚举哪些点是一个scc ...

  2. Solution -「BZOJ 3812」主旋律

    \(\mathcal{Description}\)   Link.   给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...

  3. BZOJ 4455: [Zjoi2016]小星星 [容斥原理 树形DP]

    4455: [Zjoi2016]小星星 题意:一个图删掉一些边形成一棵树,告诉你图和树的样子,求让图上的点和树上的点对应起来有多少方案 看了很多题解又想了一段时间,感觉题解都没有很深入,现在大致有了自 ...

  4. BZOJ 3771 Triple FFT+容斥原理

    解析: 这东西其实就是指数型母函数? 所以刚开始读入的值我们都把它前面的系数置为1. 然后其实就是个多项式乘法了. 最大范围显然是读入的值中的最大值乘三,对于本题的话是12W? 用FFT优化的话,达到 ...

  5. bzoj 2839 : 集合计数 容斥原理

    因为要在n个里面选k个,所以我们先枚举选的是哪$k$个,方案数为$C_{n}^k$ 确定选哪k个之后就需要算出集合交集正为好这$k$个的方案数,考虑用容斥原理. 我们还剩下$n-k$个元素,交集至少为 ...

  6. BZOJ 1853 幸运数字(容斥原理+dfs)

    题意:求闭区间内能被6和8组成的数字整除的数目.n<=1e11. 我们可以预处理出这些6和8组成的数字,大概2500个,然后排除一些如88,66的情况.这样大概还剩下1000个. 转化为[0,r ...

  7. [Sdoi2013] [bzoj 3198] spring (hash+容斥原理)

    题目描述 给出nnn个666维坐标,求有多少对点对满足恰好mmm个位置相等 1<=n<=1051<=n<=10^51<=n<=105 0<=k<=60& ...

  8. [bzoj 1471] 不相交路径 (容斥原理)

    题目描述 给出一个N(n<=150)N(n<=150)N(n<=150)个结点的有向无环简单图.给出444个不同的点aaa,bbb,ccc,ddd,定义不相交路径为两条路径,两条路径 ...

  9. [BZOJ 3771] Triple(FFT+容斥原理+生成函数)

    [BZOJ 3771] Triple(FFT+生成函数) 题面 给出 n个物品,价值为别为\(w_i\)且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? 分析 这种计数问题容易想到生成 ...

  10. BZOJ 2005 能量采集(容斥原理)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2005 题意:给定n和m,求 思路:本题主要是解决对于给定的t,有多少对(i,j)满足x= ...

随机推荐

  1. 判断是否引入jquery

    主要使用typeof检验 <script language="javascript"> if(typeof jQuery == 'undefined'){ window ...

  2. python3爬虫.1.简单的网页爬虫

    此为记录下我自己的爬虫学习过程. 利用url包抓取网页 import urllib.request #url包 def main(): url = "http://www.douban.co ...

  3. $.when()方法翻译2

    mac不知道为何,文章字数一多,浏览器就重启.只好分开写了. In the event a Deferred was resolved with no value, the corresponding ...

  4. 前端bootstrap框架禁用响应式的方法

    在Bootstrap中极其重要的一个技术内容便是响应式布局了,一次编码针对不同设备终端的强大能力使得响应式技术愈发流行. 不过正所谓“萝卜青菜各有所爱”,如果你想要使用Bootstrap开发自己的项目 ...

  5. CSS 中 nth-child 和 nth-of-type 的区别

    假设有如下代码结构,想要查找 Piggy 那个 p <section> <h1>Words</h1> <p>Little</p> <p ...

  6. inet_addr_onlink

    /* 根据指定设备的ip配置块,判断地址a,b是否在同一子网 */ /* --邻居项要求,在同一子网中的两个设备, 至少有一个接口有相同的子网配置, --也就是说对端的in_dev->ifa_l ...

  7. HZ与Jiffies

    2.4 内核定时器 内核中许多部分的工作都高度依赖于时间信息.Linux内核利用硬件提供的不同的定时器以支持忙等待或睡眠等待等时间相关的服务.忙等待时,CPU 会不断运转.但是睡眠等待时,进程将放弃C ...

  8. 判断Selenium加载完成

    How do you make Selenium 2.0 wait for the page to load? You can also check pageloaded using followin ...

  9. 修改 firefox accesskey 的快捷键

    Chrome中,如果设置了 accesskey 的话,可以通过 Alt + 快捷键 来之直接跳转的.但在Firefox 中,可能是为了防止于菜单的快捷键冲突,所以设置了 Shift + Alt + 快 ...

  10. Spring 控制台运行及RestTemplate实现Eurka负载均衡

    spring使用控制台运行方式 spring.main.web-application-type=none新老版本的配置有点差异 Maven的modules只是实现了一个顺序编译,一次多个项目一起生成 ...