刚被教练数落了一通,心情不好,来写篇题解

Problem

bzoj2560

题目简述:给定\(n\)个点的,每两个点\(i,j\)之间有\(c_{i,j}\)条直接相连的路(其中只能选一条或不选),问共有多少种方案可以使得整张图连通。\(n\leq 16\)

Solution

算是遇到的没那么套路的容斥题了 虽然还是有点套路

发现\(n\leq 16\)各种暗示我们要状压,于是按照以往状压的题的套路,设\(f(S)\)表示当\(S\)集合中的点连通方案数

发现不是很好直接计算,但总方案数又很好得出,于是考虑容斥,设\(g(S)\)表示集合\(S\)中的点之间随意相连的方案数

根据定义可得

\[g(S)=\prod_{i,j\in S}(c_{i,j}+1)
\]

想法用\(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 串珠子的更多相关文章

  1. bzoj2560串珠子 状压dp+容斥(?)

    2560: 串珠子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 515  Solved: 348[Submit][Status][Discuss] ...

  2. 【题解】Bzoj2560串珠子

    挺强的……容斥+状压DP.首先想到如果可以求出f[k],f[k]代表联通状态为k的情况下的合法方案数,则f[k] = g[k] - 非法方案数.g[k]为总的方案数,这是容易求得的.那么非法方案数我们 ...

  3. bzoj2560 串珠子

    Description 铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不 ...

  4. bzoj2560串珠子(子集dp)

    铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在ci, ...

  5. [BZOJ2560]串珠子:状压DP+容斥原理

    分析 为什么我去年6月做过这道题啊,估计当时抄的题解. 具体做法就是令\(f[S]\)表示保证连通点集\(S\)的方案数,\(g[S]\)表示不保证连通点集\(S\)的方案数. 容易想到: \[g[S ...

  6. bzoj2560 串珠子 状压DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2560 题解 大概是这类关于无向图的联通性计数的套路了. 一开始我想的是这样的,考虑容斥,那么就 ...

  7. BZOJ2560串珠子

    /* 很清新的一道题(相比上一道题) g[S]表示该 S集合中胡乱连的所有方案数, f[S] 表示S集合的答案 那么F[S] 等于G[S]减去不合法的部分方案 不合法的方案就枚举合法的部分就好了 g[ ...

  8. 2019.02.09 bzoj2560: 串珠子(状压dp+简单容斥)

    传送门 题意简述:nnn个点的带边权无向图,定义一个图的权值是所有边的积,问所有nnn个点都连通的子图的权值之和. 思路: fif_ifi​表示保证集合iii中所有点都连通其余点随意的方案数. gig ...

  9. bzoj2560串珠子——子集DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2560 转载: 很明显的状压dp 一开始写的dp可能会出现重复统计的情况 而且难以去重 假设 ...

随机推荐

  1. Mybatis笔记一:写一个demo

    什么是Mybatis? 在Java中,我们连接数据库可以使用最初级的JDBC,但是这样很麻烦,每次都要写好多,所以Mybatis出现了,Mybatis可以帮我们很简单很简单的实现与数据库的读取改写操作 ...

  2. C# 主动发起请求代码

    本文用于写代码是给提示 private string GetHW(string uri) { string returnStr = ""; HttpWebRequest hwReq ...

  3. Linux记录-告警脚本

    #!/bin/bash export JAVA_HOME=/app/jdk/jdk1.8.0_92 export HADOOP_CONF_DIR=/home/hdfs/balancer/hadoop- ...

  4. Windows2012 要远程登录,你需要具有通过远程桌面服务进行登录的权限.

    直接说正题... 提示如下: 解决办法: gpedit进入策略组:计算机配置->Windows设置->安全设置->本地策略->用户权限分配,找到拒绝通过远程桌面服务登录,把里面 ...

  5. Eclipse 中报错的阅读顺序

    1 九月 19, 2018 8:49:53 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefin ...

  6. vue使用字体图标转码问题

    使用iconfont字体之后,出现的是一个方框,而没有出现相应的图标 需要通过String.fromCharCode方法转成指定unicode编码对应的十六进制字符 <div class=&qu ...

  7. 十种MYSQL显错注入原理讲解(三)

    这回间隔时间有点长了,年前年后忙的头晕眼花,外加大病.下面我继续讲解. 1.multipolygon() and multipolygon((select * from(select * from(s ...

  8. bzoj 3620 暴力KMP

    十分暴力的KMP,枚举左端点,在向右侧推进的同时,取较小的la保证条件,n方暴力 #include<bits/stdc++.h> #define rep(i,j,k) for(int i= ...

  9. 【python小练】0011题

    第 0011 题: 敏感词文本文件 filtered_words.txt,里面的内容为以下内容,当用户输入敏感词语时,则打印出 Freedom,否则打印出 Human Rights. #word.tx ...

  10. Servlet 快速开始 表单中文字段

    req.getParameter | getParameterValue 一大特点是 返回null表示没有. [web.xml] <servlet> <serlvlet-mappin ...