BZOJ 2560(子集DP+容斥原理)
2560: 串珠子
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 757 Solved: 497
[Submit][Status][Discuss]
Description
现在已知所有珠子互不相同,用整数1到n编号。对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在ci,j根不同颜色的绳子中选择一根将它们连接。如果把珠子看作点,把绳子看作边,将所有珠子连成一个整体即为所有点构成一个连通图。特别地,珠子不能和自己连接。
铭铭希望知道总共有多少种不同的方案将所有珠子连成一个整体。由于答案可能很大,因此只需输出答案对1000000007取模的结果。
Input
标准输入。输入第一行包含一个正整数n,表示珠子的个数。接下来n行,每行包含n个非负整数,用空格隔开。这n行中,第i行第j个数为ci,j。
Output
标准输出。输出一行一个整数,为连接方案数对1000000007取模的结果。
Sample Input
0 2 3
2 0 4
3 4 0
Sample Output
HINT
对于100%的数据,n为正整数,所有的ci,j为非负整数且不超过1000000007。保证ci,j=cj,i。每组数据的n值如下表所示。
题解
这题是一个状压DP,或者说子集DP。。
设计两个数组,f[i]代表构成一个状态为i的连通图的方案数。
g[i]代表构成一个状态为i的图(不保证联通)的方案数。
然后g[i]可以枚举i中的每一个有序点对对应的a[i][j]+1的乘积求出。
比如i在二进制下为1011,所以g[i]就是a[1][2]*a[1][4]*a[2][4];
那么f[i]怎么求呢?可以用容斥。
当前点集为联通图的方案数等于总方案数-一个子集是连通图的方案数*这个子集的补集不保证是连通图的方案数。
那么我们枚举子集就可以了。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 const long long mod=1e9+7; 8 const long long N=20; 9 long long n,a[N][N],g[1<<20],f[1<<20]; 10 long long lowbit(long long x){ 11 return x&-x; 12 } 13 int main(){ 14 scanf("%lld",&n); 15 for(long long i=1;i<=n;i++) 16 for(long long j=1;j<=n;j++){ 17 scanf("%lld",&a[i][j]); 18 } 19 for(long long i=1;i<=(1<<n)-1;i++){ 20 g[i]=1; 21 for(long long j=1;j<=n;j++){ 22 if((1<<j-1)&i){ 23 for(long long k=j+1;k<=n;k++){ 24 if((1<<k-1)&i){ 25 g[i]=(g[i]*(a[j][k]+1))%mod; 26 } 27 } 28 } 29 } 30 f[i]=g[i]; 31 long long now=i^lowbit(i); 32 for(long long j=now;j;j=(j-1)&now){ 33 f[i]=((f[i]-f[i^j]*g[j])%mod+mod)%mod; 34 } 35 } 36 printf("%lld",f[(1<<n)-1]); 37 return 0; 38 }
转载于:https://www.cnblogs.com/Xu-daxia/p/9719407.html
BZOJ 2560(子集DP+容斥原理)相关推荐
- loj 300 [CTSC2017]吉夫特 【Lucas定理 + 子集dp】
题目链接 loj300 题解 orz litble 膜完题解后,突然有一个简单的想法: 考虑到\(2\)是质数,考虑Lucas定理: \[{n \choose m} = \prod_{i = 1} { ...
- 【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理
题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果. 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum ...
- BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)
(Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...
- 【bzoj 4455】小星星(树型DP+容斥原理+dfs建树和计算的2种方式)
题意:给一个n个点的图和一个n个点的树,求图和树上的点一一对应的方案数.(N<=17) 解法: 1.在树的结构上进行tree DP,f[i][j]表示树上点 i 对应图上点 j 时,这个点所在子 ...
- bzoj 4455: [Zjoi2016]小星星 树形dp+容斥原理
题意 给出一棵树和一个图,问有多少种方法把树的节点标号使得其在改图中至少有一棵生成树与原来的树是重构的. n<=17 分析 想到了容斥,但是没想到从哪里容斥... 显然题目给了两个限制,一个是原 ...
- bzoj 2560: 串珠子【状压dp】
正难则反,设g[s]为集合s不一定联通的方案数,这个很好求,把边数+1乘起来即可,f[s]为s一定联通的方案数 f考虑容斥,就是g[s]-Σf[nw]*g[s^nw],nw是s的子集,这样就减掉了不联 ...
- bzoj2560串珠子——子集DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2560 转载: 很明显的状压dp 一开始写的dp可能会出现重复统计的情况 而且难以去重 假 ...
- 【BZOJ-2669】局部极小值 状压DP + 容斥原理
2669: [cqoi2012]局部极小值 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 561 Solved: 293 [Submit][Stat ...
- Codeforces Round #590 (Div. 3) F. Yet Another Substring Reverse 子集dp
传送门 文章目录 题意: 思路: 题意: 思路: 之前做过类似的题,翻转一个字串相当于将任意两个不相交的串连在一起.再一看字符集≤20\le20≤20,那就是铁子集dpdpdp了. 定义f[i]f[i ...
最新文章
- 安装autoit libary失败问题解决
- springMvc注解之@ResponseBody和@RequestBody
- Thymeleaf 简介、教程
- 如何设计不宕机的 Redis 高可用服务?
- 任意形状文本检测:Look More Than Once
- 一个类中可以没有main方法_一个月可以暴瘦二十斤的减肥方法
- 【转载】如何把Mysql5.5数据库的数据导入到MSSql 数据库中【mysql-connector-odbc-3.51.28-win32】...
- data为long 怎么设置vue_vue.js入门
- pandas训练集测试集划分_用pandas划分数据集实现训练集和测试集
- 广告机CE认证 FCC认证费用构成
- 磨刀不误砍柴工——利用JMP探索离群值
- linux usb有线网卡驱动_linux系统下安装usb网卡驱动图文?
- linux的input命令,Linux(Ubuntu)下如何修改鼠标速度——”xinput”命令使用方法
- 【主动学习 03】Active Self-Paced Learning for Cost-Effective and Progressive Face Identification (PAMI‘18)
- 微信公众号刷票思路 Python
- c# 指定打开某个路径下的CMD_Windows小技巧 批处理文件实现目录下文件批量打包压缩...
- [Android系统]android7.1 修改系统默认输入法
- spring中@Autowired用法
- JSP 中的消息框:警告框、确认框、提示框
- php特殊表情符号拦截
热门文章
- 粒子群课设_GitHub - LIYAJUN2018/tscss: 基于粒子群算法的中职自动排课系统
- 快捷键关机电脑_电脑还可以这样关机?炫技术的时候到了!
- getset原子性 redis_RedisAPI原子性操作及原理解析
- 爆炸性环境设备通用要求标准_防爆电气设备的适用环境及温度要求
- java取负数_阿里巴巴 Java 开发手册之MySQL 规约
- 计算机第二显示器黑屏的处理,电脑显示器黑屏的维修处理办法
- linux git hook,前端通过githook一键自动部署项目
- 华中师范大学邮箱matlab,正版软件管理与服务平台(华中师范大学)
- 解决Julia使用PyPlot库出现ERROR: ArgumentError: hasproperty of NULL PyObject问题
- spring注释_Spring注释