Description

  铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子。现在铭铭想用绳子把所有的珠子连接成一个整体。

  现在已知所有珠子互不相同,用整数1到n编号。对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在 ci,j根不同颜色的绳子中选择一根将它们连接。如果把珠子看作点,把绳子看作边,将所有珠子连成一个整体即为所有点构成一个连通图。特别地,珠子不能和自己连接。

  铭铭希望知道总共有多少种不同的方案将所有珠子连成一个整体。由于答案可能很大,因此只需输出答案对1000000007取模的结果。

 

Input

  输入第一行包含一个正整数n,表示珠子的个数。

  接下来n行,每行包含n个非负整数,用空格隔开。这n行中,第i行第j个数为ci,j。

Output

  输出一行一个整数,为连接方案数对1000000007取模的结果。

Sample Input

3

0 2 3

2 0 4

3 4 0

Sample Output

50

网上都说这是枚举子集的模板,然后我根本不知道如何装压。。。

我们设为点集为i时总的方案数,很显然就是所有(边权+1)的乘积。为点集为i时这张图连通的方案数。-{图不连通的方案数}。我们就先将点集S中的一个点j(具体哪个点没有影响)取出,然后剩下的点就有两种状态:1.与j在一个连通块内,2.与j不在一个连通块内。

我们设与j不在同一个连通块内的点集为T,那么这个状态对的贡献就是。T集合中的元素就随便了,但是S^T集合,也就是与j在同一个连通块内的集合必须保证连通。因为T与S^T集合中的点没有边相连,所以此时图肯定是不连通的。

这里有些难以理解的地方就是为什么要固定一个点j。因为固定了一个点之后,所有点的状态都只有两个(上面提过,与j连通与不连通两种),然后我们通过枚举每个点的状态就不可不重不漏地将所有状态表达出来了。

具体的枚举子集的方法网上到处都是,还是不写了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#define ll long long
#define mod 1000000007ll
#define N 17 using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;} int n;
int c[N][N];
ll g[1<<N],f[1<<N];
int st[N];
void pre(int s) {
g[s]=1;
st[0]=0;
for(int i=1;i<=n;i++) {
if(s&(1<<i-1)) st[++st[0]]=i;
}
for(int i=1;i<=st[0];i++) {
for(int j=i+1;j<=st[0];j++) {
g[s]=g[s]*(c[st[i]][st[j]]+1)%mod;
}
}
}
int main() {
n=Get();
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
c[i][j]=Get();
}
}
for(int i=0;i<(1<<n);i++) pre(i);
for(int s=1;s<(1<<n);s++) {
f[s]=g[s];
int res=s&(-s);
res^=s;
for(int j=res;j;j=(j-1)&res) {
f[s]=(f[s]-g[j]*f[s^j]%mod+mod)%mod;
}
}
cout<<f[(1<<n)-1];
return 0;
}

BSOJ 4062 -- 【清华集训2012】串珠子的更多相关文章

  1. P2260 [清华集训2012]模积和

    P2260 [清华集训2012]模积和 整除分块+逆元 详细题解移步P2260题解板块 式子可以拆开分别求解,具体见题解 这里主要讲的是整除分块(数论分块)和mod不为素数时如何求逆元 整除分块:求Σ ...

  2. P2260 [清华集训2012]模积和 【整除分块】

    一.题目 P2260 [清华集训2012]模积和 二.分析 参考文章:click here 具体的公式推导可以看参考文章.博主的证明很详细. 自己在写的时候问题不在公式推导,公式还是能够比较顺利的推导 ...

  3. 洛谷 P2260 [清华集训2012]模积和 || bzoj2956

    https://www.lydsy.com/JudgeOnline/problem.php?id=2956 https://www.luogu.org/problemnew/show/P2260 暴力 ...

  4. 洛谷P2260 [清华集训2012]模积和(容斥+数论分块)

    题意 https://www.luogu.com.cn/problem/P2260 思路 具体思路见下图: 注意这个模数不是质数,不能用快速幂来求逆元,要用扩展gcd. 代码 #include< ...

  5. luoguP2260 [清华集训2012]模积和

    题意 \(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}n\%i*m\%j*[i!=j]\) \(\sum\limits_{i=1}^{n}\sum\limits ...

  6. Luogu P4247 [清华集训2012]序列操作

    题意 给定一个长度为 \(n\) 的序列 \(a\) 和 \(q\) 次操作,每次操作形如以下三种: I a b c,表示将 \([a,b]\) 内的元素加 \(c\). R a b,表示将 \([a ...

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

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

  8. BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)

    (Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...

  9. UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]

    #274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...

随机推荐

  1. VS2013 OpenGL 开发程序时: error LNK2019: 无法解析的外部符号 __imp____glutInitWithExit@12,error LNK2019: 无法解析的外部符号 __imp____glutCreateWindowWithExit@8

    环境:Windows 下 OpenGL ,Used in VS2013 前言:刚接触 OpenGL 的人,第一件事当然就是配置环境,说起配置环境 OpenGL 和 DirectX 相差不多,同时也基本 ...

  2. 关于我空间那篇名为《JavaScript axError:Unexpected token ILLEGAL 很简单的代码……》的随笔

    如图所示,我是空间的那片随笔,这里就不贴出链接了,也不希望你有这个兴趣,不知道会不会有人无意间闯入,额,自从日志用windows live writer 2009 发了那篇随笔后,我在网页上一直没能正 ...

  3. JQuery官方学习资料(译):操作元素

      获取和设置元素的信息     有很多种方式可以改变现有的元素,最常见的是改变HTML内容或者元素的属性.JQuery提供了简单的夸浏览器的方法来帮助你实现元素信息的获取和设置. .html():获 ...

  4. c# chart控件柱状图,改变柱子宽度

    让柱状图紧挨 改变柱状图宽度 chart1.Series[0]["PointWidth"] = "2";

  5. [android] 线性布局和布局的组合

    /****************2016年4月25日 更新******************************/ 知乎:对于开发者来说,Android 的开发者选项里有哪些实用的功能? 汤涛 ...

  6. [nodejs] nodejs开发个人博客(七)后台登陆

    定义后台路径 访问这个路径进入后台页面 http://localhost:8888/admin/login 在后台路由控制器里面(/admin/index.js)调用登陆控制器(/admin/logi ...

  7. Java高并发 -- J.U.C.组件扩展

    Java高并发 -- J.U.C.组件扩展 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 FutureTask Future模式,核心思想是异步调用.和同步调用的区别 ...

  8. with与上下文管理器

    如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 "with" 关键字的语句,它通常用在什么场景呢? 对于系统资源如文件.数据库连接.socket 而言,应用程序打开这 ...

  9. 记录使用Redis和nginx 实现一个简单的负载均衡(FB)

    这两年在博客园看了不少大牛的分享,一直打算能写点什么东西. 之前偶然看见一个利用Redis 当作 Session数据宿主的demo,出处我已经找不到了.后来没事看了看nginx相关的东西.其中负载均衡 ...

  10. webpack+vue+vueRouter模块化构建完整项目实例详细步骤-入门篇

    新建项目 开始(确认已经安装node环境和npm包管理工具) 1.新建项目文件名为start_vuedemo 2.npm init -y 初始化项目,我的win7系统,工程在d盘的vue_test_p ...