【2016NOIP十连测】【test4】【状压DP】【容斥原理】巨神兵
题目大意:
给一个n个点(n<=17),m条边的有向图(无自环、无重边),求其无环子图的方案数。
题解:
看到n<=17,显然是用状压dp。
用f[i]表示点集i的满足条件的方案数。
状态转移时可以一层一层地把点加进点集。
具体的,枚举已知点集i,在i的补集中枚举下一层的点集j(可以无边相连)(以下i,j定义相同),
统计由i连向j的边e。对于这些边,每一条都可以选或不选,
就有2e种情况,即:
f[i^j]+=f[i]*2e;
这显然是错误的,
因为对于点集k的一种连边方案,可以有多种方式划分成i,j,
这就意味着不同的i,j可能包含了同样的方案。
于是以j中包含的元素把并集为k的i和j分类
转移的时候多乘个容斥系数就可以了,即:
f[i^j]+=f[i]*2e*(-1)size(j)+1;
复杂度O(3nm)可优化成O(3n+2nm);
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const int N = ;
const int M = ;
const int P = 1e9+; ll read(){
ll re=;bool neg=;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') neg=;ch=getchar();}
while (isdigit(ch)) re=re*+ch-'',ch=getchar();
if (neg) re=-re; return re;
} int n,m,U;
int p2[M],coe[<<N],g[N][N];
int f[<<N],deg[<<N],sum[<<N]; void readin(){
n=read(),m=read();
for (int i=;i<m;i++)
g[read()-][read()-]=;
U=(<<n)-;
} void prework(){
p2[]=;coe[]=-;
for (int i=;i<=m;i++){
p2[i]=p2[i-]<<;
if (p2[i]>=P) p2[i]%=P;
}
for (int i=;i<(<<n);i++){
coe[i]=coe[i>>];
if (i&) coe[i]*=-;
}
} void dp(){
f[]=;
for (int i=;i<U;i++){
for (int j=;j<n;j++)deg[<<j]=;
for (int j=;j<n;j++)if ((<<j)&i)
for (int k=;k<n;k++) deg[<<k]+=g[j][k];
int C=U^i;sum[]=;
for (int tmp=(C-)&C;;tmp=(tmp-)&C){
int Now=C^tmp;
sum[Now]=sum[Now-(Now&-Now)]+deg[Now&-Now];
f[i^Now]=(f[i^Now]+(ll)f[i]*p2[sum[Now]]*coe[Now])%P;
if (!tmp) break;
}
}
} int main(){
readin();
prework();
dp();
printf("%d\n",f[U]);
return ;
}
【2016NOIP十连测】【test4】【状压DP】【容斥原理】巨神兵的更多相关文章
- 【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理
题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果. 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum ...
- 【bzoj2560】串珠子 状压dp+容斥原理
题目描述 有 $n$ 个点,点 $i$ 和点 $j$ 之间可以连 $0\sim c_{i,j}$ 条无向边.求连成一张无向连通图的方案数模 $10^9+7$ .两个方案不同,当且仅当:存在点对 $(i ...
- BZOJ2669 [cqoi2012]局部极小值 状压DP 容斥原理
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2669 题意概括 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所 ...
- 4455: [Zjoi2016]小星星|状压DP|容斥原理
OrzSDOIR1ak的晨神 能够考虑状压DP枚举子集,求出仅仅保证连通性不保证一一相应的状态下的方案数,然后容斥一下就是终于的答案 #include<algorithm> #includ ...
- 【BZOJ 2669】 2669: [cqoi2012]局部极小值 (状压DP+容斥原理)
2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 667 Solved: 350 Description 有一 ...
- 牛客网 十二桥问题(状压DP)
https://ac.nowcoder.com/acm/contest/1104/B 注意到\(\text{K}\)只有\(12\),因此对起点与每个毕经边对应的点单源最短路,\(\text{DP}\ ...
- BZOJ 2669 CQOI2012 局部极小值 状压dp+容斥原理
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2669 题意概述:实际上原题意很简洁了我就不写了吧.... 二话不说先观察一下性质,首先棋盘 ...
- HDU5838 Mountain(状压DP + 容斥原理)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5838 Description Zhu found a map which is a N∗M ...
- 【BZOJ-2669】局部极小值 状压DP + 容斥原理
2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 561 Solved: 293[Submit][Status ...
- BZOJ3812 主旋律(状压dp+容斥原理)
设f[S]为S点集是SCC的方案数.考虑通过去掉不合法方案转移.可以枚举入度为0的SCC所含点集S',这样显然S^S'内部的边和由S'连向S^S'的边删还是不删任选.但是这样无法保证S'包含所有入度为 ...
随机推荐
- Integer to Roman & Roman to Integer
Integer to Roman Given an integer, convert it to a roman numeral. The number is guaranteed to be wit ...
- Javascript之对象的创建
面向对象语言有一个非常显著的标志,那就是它们都有类的概念,通过类之间的继承就可以达到任意创建具有相同属性方法的对象.而在ECMAScript中并没有类的概念,它把对象定义为:无序属性的集合,其属性包含 ...
- 第一次ActiveX Fuzzing测试
接着上一篇的看雪Exploit me试题. 这道题给出了一个ActiveX的DLL,挖掘这个DLL中的漏洞. 由于从来没有接触过ActiveX的Fuzzing,所以找了一些文章来看.自己动手试验了一下 ...
- **IOS自动完成(搜索自动提示)功能实现
UISearchBar搜索AutoComplete下拉列表搜索提示 http://www.codeios.com/thread-10685-1-1.html 介绍: 在搜索框上加入下拉列表.在 ...
- BCD码
BCD码(Binary-Coded Decimal)亦称二进码十进数或二-十进制代码,是用4位二进制数来表示1位十进制数中的0~9这10个数码,用一种使用二进制编码十进制的数字编码形式.BCD码这种 ...
- SQL 2008 还原SQL 2005备份文件不成功的解决方
在SQL Server 2008 r2上还原一个SQL Server 2005时,还原不成功,提示如下信息: 按照如下情况则还原成功: -- 查看备份文件的类型 RESTORE FILELISTONL ...
- javascript输入验证数字方法,适合充值时输入正整数验证
说明:用于验证正整数的输入,不允许输入其他字符. html: <input type="text" id="sell_jobNum" name=" ...
- Linux 中 &、jobs、fg、bg 等命令
参考 Unix 或 Linux 中 &.jobs.fg.bg 等命令的使用方法 对之前文章的一个补充: linux 命令后台运行 这篇还是比较简单的,稍微一带而过 fg.bg.jobs.&a ...
- Vue.js中 watch(深度监听)的最易懂的解释[转]
https://blog.csdn.net/qq_36688143/article/details/81287535 taskData: { handler(v) { // watch 方法其实默认写 ...
- 【LOJ】#2537. 「PKUWC2018」Minimax
题解 加法没写取模然后gg了QwQ,de了半天 思想还是比较自然的,线段树合并的维护方法我是真的很少写,然后没想到 很显然,我们有个很愉快的想法是,对于每个节点枚举它所有的叶子节点,对于一个叶子节点的 ...