题解-bzoj2560 串珠子
刚被教练数落了一通,心情不好,来写篇题解
Problem
题目简述:给定\(n\)个点的,每两个点\(i,j\)之间有\(c_{i,j}\)条直接相连的路(其中只能选一条或不选),问共有多少种方案可以使得整张图连通。\(n\leq 16\)
Solution
算是遇到的没那么套路的容斥题了 虽然还是有点套路
发现\(n\leq 16\)各种暗示我们要状压,于是按照以往状压的题的套路,设\(f(S)\)表示当\(S\)集合中的点连通方案数
发现不是很好直接计算,但总方案数又很好得出,于是考虑容斥,设\(g(S)\)表示集合\(S\)中的点之间随意相连的方案数
根据定义可得
\]
想法用\(g\)去消掉\(f\)不满足题意的方案数,联想到城市规划中的做法:限定\(1\)号节点的连通集合大小
类似的,这里可以限定\(S\)中编号最小的点连通大小(当然编号最大的点也行)
枚举\(S\)中编号最小的点连通块大小,可以得到(设\(H\)为集合\(S\)中去除最小元素的集合):
\(f(S)=g(S)-\sum_{T\subseteq H}g(T)f(S-T)\)
题目之间类比关系好多啊,比如上一篇就是二项堆和AC自动机的类比
Code
#include <cstdio>
const int N=18,M=1<<N,p=1e9+7;
int g[M],f[M],bin[N];
int a[N][N],n;
inline int qm(int x){return x<p?x:x-p;}
int main(){
scanf("%d",&n);
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)
scanf("%d",&a[i][j]);
bin[0]=1;
for(int i=1;i<=n;++i)bin[i]=bin[i-1]<<1;
for(int S=0,s;S<bin[n];++S){
f[S]=1;
for(int i=0;i<n;++i)if(bin[i]&S)
for(int j=i+1;j<n;++j)if(bin[j]&S)
f[S]=1ll*f[S]*(a[i][j]+1)%p;
g[S]=f[S],s=(S-1)&S;
for(int i=s;i;i=(i-1)&s)
f[S]=qm((int)f[S]-1ll*g[i]*f[S^i]%p+p);
}
printf("%d\n",f[bin[n]-1]);
return 0;
}
题解-bzoj2560 串珠子的更多相关文章
- bzoj2560串珠子 状压dp+容斥(?)
2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 515 Solved: 348[Submit][Status][Discuss] ...
- 【题解】Bzoj2560串珠子
挺强的……容斥+状压DP.首先想到如果可以求出f[k],f[k]代表联通状态为k的情况下的合法方案数,则f[k] = g[k] - 非法方案数.g[k]为总的方案数,这是容易求得的.那么非法方案数我们 ...
- bzoj2560 串珠子
Description 铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不 ...
- bzoj2560串珠子(子集dp)
铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在ci, ...
- [BZOJ2560]串珠子:状压DP+容斥原理
分析 为什么我去年6月做过这道题啊,估计当时抄的题解. 具体做法就是令\(f[S]\)表示保证连通点集\(S\)的方案数,\(g[S]\)表示不保证连通点集\(S\)的方案数. 容易想到: \[g[S ...
- bzoj2560 串珠子 状压DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2560 题解 大概是这类关于无向图的联通性计数的套路了. 一开始我想的是这样的,考虑容斥,那么就 ...
- BZOJ2560串珠子
/* 很清新的一道题(相比上一道题) g[S]表示该 S集合中胡乱连的所有方案数, f[S] 表示S集合的答案 那么F[S] 等于G[S]减去不合法的部分方案 不合法的方案就枚举合法的部分就好了 g[ ...
- 2019.02.09 bzoj2560: 串珠子(状压dp+简单容斥)
传送门 题意简述:nnn个点的带边权无向图,定义一个图的权值是所有边的积,问所有nnn个点都连通的子图的权值之和. 思路: fif_ifi表示保证集合iii中所有点都连通其余点随意的方案数. gig ...
- bzoj2560串珠子——子集DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2560 转载: 很明显的状压dp 一开始写的dp可能会出现重复统计的情况 而且难以去重 假设 ...
随机推荐
- scrapy框架使用教程
scrapy框架真的是很强大.非常值得学习一下.本身py就追求简洁,所以本身代码量很少却能写出很强大的功能.对比java来说.不过py的语法有些操蛋,比如没有智能提示.动态语言的通病.我也刚学习不到1 ...
- python 面向对象(一)初识面向对象
##################################总结#################### 1. 面向过程:一切以事物的发展流程为中心 面向对象:一切以对象为中心,一切皆为对向, ...
- java生产环境增量发版陷阱【原】
前言 在生产环境,我们为了降低发版风险,一般都只做增量发布,不做全量发布. 除非项目只有一到两人开发,对时间线和代码脉络结构一清二楚,才可全量发布. 然而增量发布也是有一定隐藏陷阱在里面的,以下就是笔 ...
- 那些年我们没能bypass的xss filter[from wooyun]
原文链接:http://zone.wooyun.org/content/6899 小弟初学xss才10天.不过个人很喜欢收集xss payload.在这里把自己平时挖xss时会用到的payloads列 ...
- HDU 1088(文本处理 **)
题意是对一段文本进行处理,如果读到 <br>,则换行:如果读到 <hr>,若当前行无字符,则输出 80 个 ’-‘ 并换行,否则在下一行输出 80 个 ’-‘ 再换行:如果一行 ...
- python matplotlib 库学习
基本使用 import matplotlib.pyplot as plt import numpy as np x = np.linspace(-1,1,50) y = 2*x+1 plt.figur ...
- 二.LinkedList原理及实现学习总结
一.LinkedList实现原理概述 LinkedList 和 ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同.LinkedList 是基于链表实现的(通过名字也能 ...
- jsp快速开始
[greeting.jsp] <%@ page contentType="text/html;charset=UTF-8" language="java" ...
- python中的join.set ,copy以及删除注意事项:
1 ,join : 将对象以字符串的方式拼接成一个整体 for E : li = ["李白", "是", "诗仙"] s = & ...
- printf是在libc库中么?
libc中果然有很多的函数,使用nm看了一下,里面竟然还有reboot函数,汗! 使用grep,可以看到各种 printf 也都在这里头. objdump是看函数的地址与函数名对应的,虽然也能证明pr ...