uoj37 主旋律
标程:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<bitset>
using namespace std;
typedef long long ll;
const int mod=1e9+;
const int N=;
int read()
{
int x=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x*f;
}
int n,m,Max,pop[N],pow[N],sum_e[N],to_e[N],f[N],a,b,e[N],ie[N],u[N];
int lowbit(int x){return x&(-x);}
int main()
{
n=read();m=read();
for (int i=;i<=m;i++)
{
a=read(),b=read();
e[<<a-]|=<<b-,ie[<<b-]|=<<a-;
}
Max=<<n;pow[]=;
for (int i=;i<Max;i++) pop[i]=pop[i>>]+(i&),pow[i]=(ll)pow[i-]*%mod;
for (int i=;i<Max;i++)
{
int v=lowbit(i);int p=i^v;
sum_e[i]=sum_e[i^v]+pop[e[v]&i]+pop[ie[v]&i];
f[i]=pow[sum_e[i]];to_e[i]=;
for (int j=p;j;j=(j-)&p)
u[i]=((ll)u[i]-(ll)f[i^j]*u[j]%mod+mod)%mod;
for (int j=i;j;j=(j-)&i)
{
int v=lowbit(i^j);to_e[j]=to_e[j|v]-pop[e[v]&(i^j)]+pop[ie[v]&j];
f[i]=((ll)f[i]-(ll)pow[sum_e[i^j]+to_e[j]]*u[j]%mod+mod)%mod;
}
u[i]=((ll)u[i]+f[i])%mod;
}
printf("%d\n",f[Max-]);
return ;
}
技巧:用lowbit(i)取出i中的任意一个元素(注意是移位<<后的)。
题解:状压枚举子集+容斥dp
乍一看只知道状压。。。强联通是什么鬼嘛。。。
考虑一个不强联通的图,至少有一个点的入度为0。
这样就可以容斥啦:全集-不强连通的图数=强联通的图数。
枚举缩点后入度为0的块有多少个,设包含入度为0的块的集合为T。f[S]表示S集合中的点构成强联通图的方案数,g[S][k]表示将S集合分成k个独立块的方案数,u[S][k]表示带容斥系数的g之和。e(S)表示S点集中的边数。e(S,T)表示从S中的点连出向T的边数。

u[S]也可以通过容斥求得。为了不算重,取一个S集中的点v作为连通块部分的必选点。(减号就相当于是连通块个数+1,(-1)^k变号)


求u和f的时间复杂度都是O(n^3)。求e(S)和e(S,T)都可以通过在子集上累加的方法计算。
uoj37 主旋律的更多相关文章
- bzoj3812&uoj37 主旋律
正着做不好做,于是我们考虑反着来,如何计算一个点集s的答案呢,一定是所有的方案减去不合法的方案,不合法的方案一定是缩完点后是一个DAG,那么就一定有度数为0的scc,于是我们枚举s的子集,就是说这些点 ...
- UOJ37. 【清华集训2014】主旋律
http://uoj.ac/problem/37 题解 题目是让我们求出有多少个边集可以使这张图强连通. 先补集转化一下,求这张图不强连通的方案数. 我们考虑这样的图缩完点之后的情况,既然不强连通,那 ...
- bzoj 3812: 主旋律 [容斥原理 状压DP]
3812: 主旋律 题意:一张有向图,求它的生成子图是强连通图的个数.\(n \le 15\) 先说一个比较暴力的做法. 终于知道n个点图的是DAG的生成子图个数怎么求了. 暴力枚举哪些点是一个scc ...
- 【BZOJ 3812】 3812: 主旋律 (容斥原理**)
3812: 主旋律 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 235 Solved: 196 Description 响应主旋律的号召,大家决定 ...
- BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)
这道题跟另一道题很像,先看看那道题吧 巨神兵(obelisk) 题面 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张 ...
- 清华集训2014 day1 task2 主旋律
题目 这可算是一道非常好的关于容斥原理的题了. 算法 好吧,这题我毫无思路,直接给正解. 首先,问题的正面不容易求,那么就求反面吧: 有多少种添加边的方案,使得这个图是DAG图(这里及以下所说的DAG ...
- UOJ#37. 【清华集训2014】主旋律
题目大意: 传送门 题解: 神题……Orz. 首先正难则反. 设$f_S$表示选取点集状态为s时,这部分图可以构成非强联通图的方案数. 设$p_{S,i}$表示点集s缩点后有i个入度为0点的方案数,保 ...
- BZOJ3812 主旋律(状压dp+容斥原理)
设f[S]为S点集是SCC的方案数.考虑通过去掉不合法方案转移.可以枚举入度为0的SCC所含点集S',这样显然S^S'内部的边和由S'连向S^S'的边删还是不删任选.但是这样无法保证S'包含所有入度为 ...
- BZOJ3812主旋律
/* 这道题其实没有看懂 所以整理一下吧 首先思想转化成所有方案减去不强联通的方案 不强联通的方案相当于很多强联通分量缩点后的dag 转化成子问题, 问很多点的dag方案数 然后枚举作为出度为0的点集 ...
随机推荐
- python从入门到大神---2、和Python编程相遇的日子
python从入门到大神---2.和Python编程相遇的日子 一.总结 一句话总结: python2和python3是很不同的,连语法都不同,比如 print 函数打印结果 1.python中pip ...
- Adobe Fireworks CS6 win64的安装
网页三大剑客之一 FW的安装 本人也是找了半天才找到的. (没有视频)这里先感谢原帖给我的链接https://blog.csdn.net/qq_38053395/article/details/ ...
- Python匹马行天下之_循环
一.while循环 如果条件成立(true),重复执行相同操作,条件不符合,跳出循环 while 循环条件: 循环操作 (1)while循环示例 例:输入王晓明5门课程的考试成绩,计算平均成绩 1 ...
- 初识OpenCV-Python - 001
主要用代码注释来初步学习OpenCV-Python 1. 图片初使用(结合matplotlib) import cv2from matplotlib import pyplot as plt #Loa ...
- 【POJ】1611 The Suspects
题目链接:http://poj.org/problem?id=1611 题意:有学生感染了SARS.一个学生可以加入很多小组.n个学生m个小组,每个小组有k个组内成员,后跟着k个成员的组内编号.让你求 ...
- Flutter 类似viewDidAppear 的任务处理
前言 在任务之中 ,有些实时任务比较重的需求,需要在类似 iOS viewDidAppear 里面执行数据请求任务,如:上一个页面返回pop 后执行网络请求任务.在flutter中如何实现呢? 目前 ...
- 和Excel函数date同样功能的VBA函数DateSerial用法
Sub 日期别()On Error Resume Nextlastrow = Sheets("运营日报").Range("a1048576").End(xlUp ...
- JS关闭当前父级div
代码: <img src="img/diagram.png" onclick="javascript:this.parentNode.parentNode.remo ...
- linux 系统优化,调优
1.系统安装前的规则 a.分区:不同环境不同分法,按自己的需求来 以硬盘500G为例 /boot 100M-200M(只存放grub和启动相关文件,不存放其他) / 80G-100G (因为很多人默 ...
- Leetcode973. K Closest Points to Origin最接近原点的K个点
我们有一个由平面上的点组成的列表 points.需要从中找出 K 个距离原点 (0, 0) 最近的点. (这里,平面上两点之间的距离是欧几里德距离.) 你可以按任何顺序返回答案.除了点坐标的顺序之外, ...