/*
这道题其实没有看懂 所以整理一下吧
首先思想转化成所有方案减去不强联通的方案
不强联通的方案相当于很多强联通分量缩点后的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主旋律的更多相关文章

  1. BZOJ3812 主旋律(状压dp+容斥原理)

    设f[S]为S点集是SCC的方案数.考虑通过去掉不合法方案转移.可以枚举入度为0的SCC所含点集S',这样显然S^S'内部的边和由S'连向S^S'的边删还是不删任选.但是这样无法保证S'包含所有入度为 ...

  2. BZOJ3812: 主旋律

    传送门 Sol 考虑容斥 强联通图反过来就是一些缩点后的 \(DAG\) 一个套路就是对出(入)度为 \(0\) 的点进行容斥 设 \(g_S,h_S\) 分别表示选了奇数个 \(0\) 入度和偶数个 ...

  3. [BZOJ3812]主旋律:状压DP+容斥原理

    分析 Miskcoo orz 令\(f[S]\)表示使得\(S\)这个点集强连通的方案数. 然后呢?不会了 考虑到将一个有向图SCC缩点后,得到的新图是一个DAG,所以我们可以类比带标号DAG计数的解 ...

  4. bzoj3812 主旋律 容斥+状压 DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3812 题解 考虑对于图的联通性的 DP 的一般套路:总方案 - 不连通的方案. 那么我们只需要 ...

  5. bzoj3812&uoj37 主旋律

    正着做不好做,于是我们考虑反着来,如何计算一个点集s的答案呢,一定是所有的方案减去不合法的方案,不合法的方案一定是缩完点后是一个DAG,那么就一定有度数为0的scc,于是我们枚举s的子集,就是说这些点 ...

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

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

  7. BZOJ3812 清华集训2014 主旋律

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

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

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

  9. BZOJ 3812 : 主旋律

    非常神仙的状压DP+容斥原理. 首先,给出一个状压方程:$f_S$表示点集为$S$的情况下,整个点集构成强连通图的方案数. 这个DP方程还是比较容易想到的,但是没有办法正常转移,考虑通过容斥原理进行转 ...

随机推荐

  1. MySQL 建表语句 create table 中的列定义

    MySQL 建表语句 create table 中的列定义: column_definition: data_type [NOT NULL | NULL] [DEFAULT default_value ...

  2. Object.create() 的含义:从一个实例对象,生成另一个实例对象

    出处:https://wangdoc.com/javascript/oop/object.html#objectcreate 生成实例对象的常用方法是,使用new命令让构造函数返回一个实例.但是很多时 ...

  3. python核心类库:urllib使用详解

    python版本:2.7.15 1.简单用法urllib.urlopen() 语法:urllib.urlopen(url[, data[, proxies]]) :打开一个url的方法,返回一个文件对 ...

  4. 维护贴--验证可用--mysql给root开启远程访问权限,修改root密码(转)

    1.MySql-Server 出于安全方面考虑只允许本机(localhost, 127.0.0.1)来连接访问. 这对于 Web-Server 与 MySql-Server 都在同一台服务器上的网站架 ...

  5. C# 值传参和引用传参

    值传递:对于个人理解,值传递就像是python中的深拷贝,值传递的内容和原来的内容是两份不同的东西,相互不影响. 引用传递:对于个人理解,引用传递就是python中的复杂多维list的浅拷贝,它传递的 ...

  6. Feign 使用入门

    Feign 的目的是简化 Web Service 客户端的开发,在使用 Feign 时,使用注解来修饰接口,被注解修饰的接口具有访问 Web Service 的能力,包括 Feign 自带的注解,也支 ...

  7. 关于Quad PLL /CPLL参考时钟的选择

    关于Quad PLL /CPLL参考时钟的选择 1.参考时钟 2.channel PLL具体分析 CPLL端口描述 一张图说清了时钟为怎么被分成了north or south

  8. [转]Eclipse快捷键 10个最有用的快捷键

    Eclipse快捷键 10个最有用的快捷键 5 4 Eclipse中10个最有用的快捷键组合  一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的 ...

  9. 《LOST》 电视

    还没看正剧,所以转来帮助看电视 从起源到终点:<LOST>剧情全解析(一)   此文是LOST完结之后的剧情解析,剧透,慎入   从起源到终点:<LOST>剧情全解析(一) 转 ...

  10. 安装老版本redis .NET 客户端

    https://github.com/ServiceStackV3/ServiceStackV3 PM> Install-Package ServiceStack -Version 3.9.71 ...