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. [android] listview入门

    Listview组件非常重要,4分之一的时间都是在搞这个,还是通过上一节的数据库,写个for循环,插入50条数据. 先使用笨方法显示数据,根布局LinearLayout 定义一个id,在activit ...

  2. 减少页面加载时间的n种方法

    减少HTTP请求 1:减少调用其他页面.文件的数量 2:使用css spirit , 减少图片加载次数 压缩js,css代码 1:一般js.css文件中存在大量的空格.换行.注释,这些利于阅读,如果能 ...

  3. Codeforces617E(莫队)

    E. XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input ...

  4. 浅谈JS中String()与 .toString()的区别

    我们知道String()与 .toString()都是可以转换为字符串类型,但是String()与 .toString()的还是有区别的 1..toString()可以将所有的的数据都转换为字符串,但 ...

  5. C# 动态添加类、动态添加类型、代码添加类型

    引用控件: DLL下载地址:http://pan.baidu.com/s/1nv2GUWL public class TypeCreator { public static Type Creator( ...

  6. JavaScript 基础(二) - 创建 function 对象的方法, String对象, Array对象

    创建 function 对象的两种方法: 方式一(推荐) function func1(){ alert(123); return 8 } var ret = func1() alert(ret) 方 ...

  7. Web前端开发必备

    前端学习相关书籍 关于书籍 HTML.CSS 类别书籍,都是大同小异,在当当网.卓越网搜索一下很多推荐.如果感觉学的差不多了,可以关注一下<CSS禅意花园>,这个很有影响力. Javasc ...

  8. [Intellij] 在IntelliJ IDEA 中创建运行web项目

    安装工具 1.JDK7+ 2.IntelliJ Idea 工具(下载安装后,网上找注册码破解即可) 3.tomcat7+ 解压缩版 明确两个概念: 1.Project:类似于eclipse的works ...

  9. Visual Studio 20周年,我和VS不得不说的故事

    Visual Studio 2017正式版已如期发布(点击这里查看发布全记录)!自去年 11 月正式宣布 Visual Studio 项目之后,微软终于正式推出了“宇宙最强集成开发环境(IDE)”的最 ...

  10. Android为TV端助力 同时setTag两次,保存多种值

    示例代码: view.setTag(R.string.action_settings,hodler.content); 接收两个值,一个是key值,必须是唯一值,而且要写在values/ids.xml ...