BZOJ3812主旋律
/*
这道题其实没有看懂 所以整理一下吧
首先思想转化成所有方案减去不强联通的方案
不强联通的方案相当于很多强联通分量缩点后的dag
转化成子问题, 问很多点的dag方案数
然后枚举作为出度为0的点集 T, 然后S - T和T之间的边是随便连的
但是由于S-T中你不能保证不包含出度为0的点, 所以要容斥
最后得到一个式子
f(S) = \sum{T \belong S T != kongji} (-1) ^ {|T| - 1} f(S - T) * 2 ^{way(S - T, T)}
ways 函数我们可以通过预先状压一遍求出来
但是这样再转化成原来问题我们需要枚举强联通分量, 显然复杂度不对 然后我们考虑上面那个dp实际上的贡献
我们枚举所有没有出边的强联通分量缩成的点集合T, 假如T中的点组成奇数个强联通分量, 那么对于答案的贡献系数就是1, 否则是-1
用g(S)表示将S分成若干个强联通分量的方案数, 当然这里是要合并进去系数的, F(S)表示S的强联通子图的个数
然后就可以得到G(S) = F(S) - \sum{T\belong S, u \ T} F(T) g(S - T) (为啥总感觉有一种反演思想)
那么
F(S) = 2 ^ (h(S)) - \sum{T \belong S T != 0} 2 ^ way(T, S - T) + (h(S - T)) g(T)
然后子集dp就好了 */
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
#define ll long long
#define M 15
#define mmp make_pair
using namespace std;
int read() {
int nm = , f = ;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -;
for(; isdigit(c); c = getchar()) nm = nm * + c - '';
return nm * f;
}
const int mod = ;
void add(int &x, int y) {
x += y;
x -= x >= mod ? mod : ;
x += x < ? mod : ;
}
int poww[], f[ << M], g[ << M], h[ << M], p[ << M], in[ << M], out[ << M], bit[ << M], n, m;
int main() {
n = read(), m = read();
poww[] = ;
for(int i = ; i < n * n; i++) poww[i] = (poww[i - ] << ) % mod;
for(int i = ; i < << n; i++) bit[i] = bit[i - (i & -i)] + ;
for(int i = ; i <= m; i++) {
int x = read(), y = read();
x = << (x - ), y = << (y - );
out[x] |= y, in[y] |= x;
}
for(int s = ; s < << n; s++) {
int mad = s & -s, outside = s ^ mad;
for(int i = outside; i; i = (i - ) & outside)
add(g[s], -1ll * f[s ^ i] * g[i] % mod);
h[s] = h[outside] + bit[in[mad] & outside] + bit[out[mad] & outside];
f[s] = poww[h[s]];
for(int i = s; i; i = (i - ) & s) {
if(i != s) {
int one = (i ^ s) & -(i ^ s);
p[i] = p[i ^ one] + bit[out[one] & i] - bit[in[one] & (i ^ s)];
} else p[i] = ;
add(f[s], -1ll * poww[h[s ^ i] + p[i]] * g[i] % mod);
}
add(g[s], f[s]);
}
cout << f[( << n) - ] << "\n";
return ;
}
BZOJ3812主旋律的更多相关文章
- BZOJ3812 主旋律(状压dp+容斥原理)
设f[S]为S点集是SCC的方案数.考虑通过去掉不合法方案转移.可以枚举入度为0的SCC所含点集S',这样显然S^S'内部的边和由S'连向S^S'的边删还是不删任选.但是这样无法保证S'包含所有入度为 ...
- BZOJ3812: 主旋律
传送门 Sol 考虑容斥 强联通图反过来就是一些缩点后的 \(DAG\) 一个套路就是对出(入)度为 \(0\) 的点进行容斥 设 \(g_S,h_S\) 分别表示选了奇数个 \(0\) 入度和偶数个 ...
- [BZOJ3812]主旋律:状压DP+容斥原理
分析 Miskcoo orz 令\(f[S]\)表示使得\(S\)这个点集强连通的方案数. 然后呢?不会了 考虑到将一个有向图SCC缩点后,得到的新图是一个DAG,所以我们可以类比带标号DAG计数的解 ...
- bzoj3812 主旋律 容斥+状压 DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3812 题解 考虑对于图的联通性的 DP 的一般套路:总方案 - 不连通的方案. 那么我们只需要 ...
- bzoj3812&uoj37 主旋律
正着做不好做,于是我们考虑反着来,如何计算一个点集s的答案呢,一定是所有的方案减去不合法的方案,不合法的方案一定是缩完点后是一个DAG,那么就一定有度数为0的scc,于是我们枚举s的子集,就是说这些点 ...
- 【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理
题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果. 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum ...
- BZOJ3812 清华集训2014 主旋律
直接求出强联通生成子图的数量较难,不妨用所有生成子图的数量减去非强联通的. 非强联通生成子图在所点后满足编号最小的点所在的强联通分量不是全集. 由于$n$很小,我们可以考虑状态压缩. 对于点集$S$, ...
- bzoj 3812: 主旋律 [容斥原理 状压DP]
3812: 主旋律 题意:一张有向图,求它的生成子图是强连通图的个数.\(n \le 15\) 先说一个比较暴力的做法. 终于知道n个点图的是DAG的生成子图个数怎么求了. 暴力枚举哪些点是一个scc ...
- BZOJ 3812 : 主旋律
非常神仙的状压DP+容斥原理. 首先,给出一个状压方程:$f_S$表示点集为$S$的情况下,整个点集构成强连通图的方案数. 这个DP方程还是比较容易想到的,但是没有办法正常转移,考虑通过容斥原理进行转 ...
随机推荐
- java 中 heap(堆)和stack(栈)的区别
总结在Java里面Heap和Stack分别存储数据的不同. 区别项 Heap(堆) Stack(栈) JVM中的功能 内存数据区 内存指令区 存储数据 对象实例(注1) 基本数据类型, 指令代码,常量 ...
- redis 学习资料
redis 学习资料 网址 Redis 教程(菜鸟教程) http://www.runoob.com/redis/redis-tutorial.html Redis 命令参考 http://redis ...
- mysql 不允许分组的问题
异常信息:this is incompatible with sql_mode=only_full_group_by 解决办法: 找到 my.cnf find / -name my.cnf 然后在 ...
- Pullword 分词工具
def get_response(self, txt): """ 热词工具 """ datas = [] request_lists = [ ...
- HanLP的自定义词典使用方式与注意事项介绍
[环境]python 2.7 方法一:使用pyhanlp,具体方法如下: pip install pyhanlp # 安装pyhanlp 进入python安装包路径,如 /usr/lib/pytho ...
- 导入导出Excel文件
搭建环境 先新建web project ,然后Add Struts Capabilties: 下载导入导出Excel所需的jar包: poi-3.8-20120326.jar包 : http:// ...
- Usbhub驱动编译
在3g 4g的usb驱动基础上,加入以下部分,就可以驱动hub了 kmod-usb-hid 3.3.8-1 kmod-usbip 3.3.8-1 kmod-usbip-client 3.3.8-1 k ...
- 【java】private关键字
private关键字(1)修饰成员:可以修饰成员变量和成员方法(2)特点:被private修饰的后的成员只能在本类中被访问 (3)private的应用:定义类的时候,当把成员变量给private修饰 ...
- require 与 include 的区别
require 的英文意思是 需要,有赖于.如果使用了这条语句,也就是告诉PHP内核,我这个程序需要这个文件,有赖于这个文件.或者通俗点儿讲就是:我要她!所以,PHP如果发现require参数中的文件 ...
- WPF Demo12 布局
1 <Window x:Class="布局.DockPanel1" xmlns="http://schemas.microsoft.com/winfx/2006/x ...