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. R1(上)—R关联规则分析之Arules包详解

    Arules包详解 包基本信息 发布日期:2014-12-07 题目:挖掘关联规则和频繁项集 描述:提供了一个表达.处理.分析事务数据和模式(频繁项集合关联规则)的基本框架. URL:http://R ...

  2. 【CodeForces】790 C. Bear and Company 动态规划

    [题目]C. Bear and Company [题意]给定大写字母字符串,交换相邻字符代价为1,求最小代价使得字符串不含"VK"子串.n<=75. [算法]动态规划 [题解 ...

  3. [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)

    [BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...

  4. 【洛谷 P3648】 [APIO2014]序列分割 (斜率优化)

    题目链接 假设有\(3\)段\(a,b,c\) 先切\(ab\)和先切\(bc\)的价值分别为 \(a(b+c)+bc=ab+bc+ac\) \((a+b)c+ab=ab+bc+ac\) 归纳一下可以 ...

  5. NYOJ 136 等式 (哈希)

    题目链接 描述 有以下等式:a1x13+a2x23+a3x33+a4x43+a5*x53=0 x1,x2,x3,x4,x5都就在区间[-50,50]之间的整数,且x1,x2,x3,x4,x5都不等于0 ...

  6. linux 在命令行中通过conda使用anaconda

    在 ~/.bash_profile中添加 export PATH="/home/taoke/anaconda/bin:$PATH"

  7. 深入理解Spring系列之六:bean初始化

    转载 https://mp.weixin.qq.com/s/SmtqoELzBEdZLo8wsSvUdQ <深入理解Spring系列之四:BeanDefinition装载前奏曲>中提到,对 ...

  8. Android稳定性测试工具Monkey的使用

    综述    Monkey是一个命令行工具,它可以运行在我们的模拟器或者设备当中.它可以发送一些伪随机的用户事件流,例如点击.触摸.手势等.我们能够使用Monkey工具来对我们所开发的应用进行压力测试. ...

  9. 关于parse_str变量覆盖分析

    这个漏洞有两个姿势.一个是不存在的时候一个是存在的时候. 经过测试该漏洞只在php5.2中存在,其余均不存在. 倘若在parse_str函数使用的代码上方未将其定义那么即存在变量覆盖漏洞否则不行. 还 ...

  10. discuz各个目录与文件的作用说明

    discuz下面有很多文件夹以及文件,你们都知道他们是做什么的么?肯定不知道了吧.但是我们有经常遇到这些文件,譬如在后台文件校验操作都遇到某些文件被修改,这时候也需要知道这些文件是有什么作用的.今天就 ...