bzoj3812&uoj37 主旋律
正着做不好做,于是我们考虑反着来,如何计算一个点集s的答案呢,一定是所有的方案减去不合法的方案,不合法的方案一定是缩完点后是一个DAG,那么就一定有度数为0的scc,于是我们枚举s的子集,就是说这些点构成的scc的度数为0,这里我们就需要容斥了,容斥的目的是算出s集组成不合法的DAG的方案数,因为我们没有办法确定这里有几个scc。于是我们提前处理出g[s]表示这里面的每种不同scc的方案的贡献是$-1^{num-1}$,然后它们和其余的点之间随便连边,其余的点之间也随便连边,然后g数组我们是枚举任意一个点,然后枚举它所在的scc,然后在通过f数组转移,f就是总方案减去所有子集度数为0时的方案。
妙妙啊。
#include <cstdio>
#define N 16
#define mod 1000000007
using namespace std;
int n,m,to[<<N],cnt[<<N],bin[N*N],e[<<N];
int f[<<N],g[<<N];
int calc(int S,int T){
int ans=;
for(;S;S-=S&-S)
ans+=cnt[to[S&-S]&T];
return ans;
}
int main(){
scanf("%d%d",&n,&m);
bin[]=;
for(int i=;i<=m;i++)
bin[i]=bin[i-]*%mod;
for(int i=,u,v;i<=m;i++){
scanf("%d%d",&u,&v);
to[<<u-]|=<<v-;
}
for(int i=;i<bin[n];i++)cnt[i]=cnt[i>>]+(i&);
for(int i=;i<bin[n];i++)e[i]=calc(i,i);
for(int i=;i<bin[n];i++){
int k=i&-i,s=i^k;
for(int j=(s-)&s;j;j=(j-)&s)
g[i]=(g[i]-1ll*g[i^j^k]*f[j|k]%mod+mod)%mod;
if(i^k)g[i]=(g[i]-g[i^k]+mod)%mod;
f[i]=bin[e[i]];
for(int j=i;j;j=(j-)&i)
f[i]=(f[i]-1ll*g[j]*bin[e[i^j]+calc(j,i^j)]%mod+mod)%mod;
(g[i]+=f[i])%=mod;
}
printf("%d\n",f[bin[n]-]);
return ;
}
bzoj3812&uoj37 主旋律的更多相关文章
- uoj37 主旋律
题意:一个班级n个人,如果a爱b,那么a->b一条有向边.问有多少种删边集合使得图仍然强联通? n<=15. 标程: #include<cstdio> #include&l ...
- BZOJ3812 主旋律(状压dp+容斥原理)
设f[S]为S点集是SCC的方案数.考虑通过去掉不合法方案转移.可以枚举入度为0的SCC所含点集S',这样显然S^S'内部的边和由S'连向S^S'的边删还是不删任选.但是这样无法保证S'包含所有入度为 ...
- BZOJ3812主旋律
/* 这道题其实没有看懂 所以整理一下吧 首先思想转化成所有方案减去不强联通的方案 不强联通的方案相当于很多强联通分量缩点后的dag 转化成子问题, 问很多点的dag方案数 然后枚举作为出度为0的点集 ...
- 【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理
题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果. 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum ...
- BZOJ3812: 主旋律
传送门 Sol 考虑容斥 强联通图反过来就是一些缩点后的 \(DAG\) 一个套路就是对出(入)度为 \(0\) 的点进行容斥 设 \(g_S,h_S\) 分别表示选了奇数个 \(0\) 入度和偶数个 ...
- BZOJ3812 清华集训2014 主旋律
直接求出强联通生成子图的数量较难,不妨用所有生成子图的数量减去非强联通的. 非强联通生成子图在所点后满足编号最小的点所在的强联通分量不是全集. 由于$n$很小,我们可以考虑状态压缩. 对于点集$S$, ...
- [BZOJ3812]主旋律:状压DP+容斥原理
分析 Miskcoo orz 令\(f[S]\)表示使得\(S\)这个点集强连通的方案数. 然后呢?不会了 考虑到将一个有向图SCC缩点后,得到的新图是一个DAG,所以我们可以类比带标号DAG计数的解 ...
- UOJ37. 【清华集训2014】主旋律
http://uoj.ac/problem/37 题解 题目是让我们求出有多少个边集可以使这张图强连通. 先补集转化一下,求这张图不强连通的方案数. 我们考虑这样的图缩完点之后的情况,既然不强连通,那 ...
- bzoj3812 主旋律 容斥+状压 DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3812 题解 考虑对于图的联通性的 DP 的一般套路:总方案 - 不连通的方案. 那么我们只需要 ...
随机推荐
- 2018国赛 - Writeup(待补充)
10.0.0.55 Writeup Web 0x01 easyweb 解题思路 题目很脑洞 用户名admin 密码123456进去可得到flag(密码现在换了) 解题脚本 无 Reverse 0x02 ...
- Course2-Python函数和模块
一. 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率. 上一课里提到了Python的很多内置函数.在此主要讲自定义函数. 1. 定 ...
- Memcache 运行情况
Memcache Memcache是danga.com的一个开源项目,它是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的Hash表,能够用来存储各种格式的数据. 查看当前的me ...
- Java 故障安全异常处理
异常处理代码必须保证其故障安全机制,其中一条重要的规则如下: 在try-catch-finally块抛出的最后一个异常将会在调用堆栈中传递. 所有早期异常将会消失. 如果从一个catch或finall ...
- (译) JSON-RPC 2.0 规范(中文版)
http://wiki.geekdream.com/Specification/json-rpc_2.0.html 起源时间: 2010-03-26(基于2009-05-24版本) 更新: 2013- ...
- JavaScript要点汇总——The Most Important
关于JavaScript的基础变量,运算符的详解以及基本的分支循环嵌套已经在 JS基础变量及JS中的运算符 JS中的循环分支嵌套 说过了,今天我们所说的是做网页中最长用到的东西.内容不算少,要有耐心, ...
- JSF基础
JSF基础 1)JSF(JavaServer Faces)一种基于Java的Web应用的用户界面软件框架. 旨在降低web应用开发难度.减轻开发人员编写和维护web应用的负担. 一个基于JSF框架构建 ...
- string to int
problem describe: given a string , first find the first word which is not white space;then there wil ...
- node八-核心模块、包
学会查API,远比会几个API更重要. 核心模块意义 -如果只是在服务器运行javascript代码,并没有多大意义,因为无法实现任何功能>读写文件.访问网络 -Node的用处在于它本身还提供可 ...
- c++11线程池
#pragma once #include <future> #include <vector> #include <atomic> #include <qu ...