首页 > 其他分享 >[清华集训2012] 串珠子

[清华集训2012] 串珠子

时间:2024-09-18 21:02:27浏览次数:1  
标签:方案 连通 int ++ 串珠 集训 2012

[清华集训2012] 串珠子

题意

给定 \(n\) 个点和 \(n\times n\) 的矩阵 \(c\)。

有 \(c_{i,j}\) 种方案把点 \(i\) 和点 \(j\) 连接起来。

求有多少种方案使得整张图连通。

思路

注意到 \(1\le n \le 16\),考虑状压。

定义 \(g_i\) 为集合 \(i\) 的连边方案数,有

\[g_i=\prod_{u,v \in i} (c_{u,v}+1) \]

即 \((u,v)\) 有 \(c_{i,j}\) 种方案连,有一种方案不连。

定义 \(f_i\) 为集合 \(i\) 连通时的方案数,有

\[f_i=g_i-\sum_{j \subset i} g_j\times f_{C j} \]

其中 \(C\) 是补集符号。

即枚举不连通的情况减去,枚举不连通的子集,

不连通子集连边的方案数乘上补集连通的方案数就是总方案数。

实现时注意固定 \(i\) 中的一个数,这样才能不重不漏。

答案为 \(f_{2^n-1}\)。

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 20;
int n, c[N][N];
ll f[1 << N], g[1 << N];
const int mod = 1e9 + 7;
int main() {
	cin >> n;
	for (int i = 0; i < n; i ++) 
		for (int j = 0; j < n; j ++) 
			cin >> c[i][j];
	for (int i = 0; i < (1 << n); i ++) {
		g[i] = 1;
		for (int j = 0; j < n; j ++)
			if (i >> j & 1) for (int k = j + 1; k < n; k ++)
				if (i >> k & 1) 
					g[i] = g[i] * (c[j][k] + 1) % mod;
	}
	for (int i = 0; i < (1 << n); i ++) {
		int I = i ^ (i & (-i));
		f[i] = g[i];
		for (int j = I; j; j = (j - 1) & I) {
			f[i] = f[i] - g[j] * f[i ^ j];
			f[i] = (f[i] % mod + mod) % mod;
		}
	}
	cout << f[(1 << n) - 1] << "\n";
	return 0;
} 

标签:方案,连通,int,++,串珠,集训,2012
From: https://www.cnblogs.com/maniubi/p/18419322

相关文章

  • win2012服务器使用 Certbot 生成 Let's Encrypt 的域名证书
    1、安装windows版本的certbot,目前最新版是Certbot2.9.02、命令行输入[email protected]:\website\xxx\-dwww.xxx.cn其中,[email protected]为电子邮箱地址,d:\website\xxx\为网站根目录,www.xxx.cn为域名3、后面会有两次输入,第一......
  • windows server2012 配制nginx安装为服务的时候,直接跳要安装.net框架,用自动的安装,直接
    1、上一个已成功在安装过程中的图:2、之前安装过程中错误的图:3、离线安装解决:下载.netframework3.5,然后解压后,选择指定备用源路径,然后选择.net安装包所在目录:只要指定上面全路径就可以,要看到先多目录。4、再次安装nginx服务成功:这样服务就安装成功了。参考:Win......
  • [国家集训队] Crash的数字表格 / JZPTAB
    [国家集训队]Crash的数字表格/JZPTAB题目描述今天的数学课上,Crash小朋友学习了最小公倍数(LeastCommonMultiple)。对于两个正整数\(a\)和\(b\),\(\text{lcm}(a,b)\)表示能同时被\(a\)和\(b\)整除的最小正整数。例如,\(\text{lcm}(6,8)=24\)。回到家后,Crash还在想......
  • 题解 P4827【[国家集训队] Crash 的文明世界】
    从阶乘幂到斯特林数-caijianhong-博客园(cnblogs.com)题目描述Crash小朋友最近迷上了一款游戏——文明5(CivilizationV)。在这个游戏中,玩家可以建立和发展自己的国家,通过外交和别的国家交流,或是通过战争征服别的国家。现在Crash已经拥有了一个\(n\)个城市的国家,这......
  • NOIP2024集训Day27 DP常见模型4 - 树形
    NOIP2024集训Day27DP常见模型4-树形E.[COCI2014-2015#1]Kamp首先只考虑一个点,发现如果回到原来位置是比较好搞的,就每次走完子树的里面要的就上来,如果子树里面没有要走的就不走。(大概是\(f_x=\sumf_y+2\cdote_x\),因为要走过去走回来,注意\(y\)要保证子树里面有人)......
  • 【题解】Solution Set - NOIP2024集训Day27 树形 dp
    【题解】SolutionSet-NOIP2024集训Day27树形dphttps://www.becoder.com.cn/contest/5521「HDU4661」MessagePassing「BZOJ3935」Rbtree「ARC101E」RibbonsonTree「AGC034E」CompleteCompress「COCI2014.10」Kamp「SCOI2015」小凸玩密室「AGC008F」Black......
  • 【五一省选集训day4】Grid Game
    【五一省选集训day4】GridGame首先发现\(n,m\le2000\),可以考虑枚举正方形左上端点\((x_0,y_0)\)。对于一个边长为\(len\)的合法的正方形,如果\(len=k\)这个正方形全黑,需要特判,否则它至少有一个白点。我们惊奇地发现,对于这样的其中一个白点,它所在的那一列一定存在恰好\(......
  • 【五一省选集训day4】Permutation
    【五一省选集训day4】Permutation每次操作把数分成两组,每组内的顺序不变,把第\(0\)组放到第\(1\)组前面。发现这很像基于二进制的基数排序。假设我们进行\(k\)次这样的操作,就相当于给每个数赋一个值\((x,y)\),其中\(0\lex\le2^k-1,y=\texttt{数的下标}\)。然后对第一维......
  • 【五一省选集训day4】Mansion
    【五一省选集训day4】Mansion注意,本题要求输出最大值,不要把最大值看成编号……srds好像只有我看错了。这个东西一看就很能用莫队做。用莫队按\(l\)分块,再按\(r\)排序。维护一棵线段树,每次移动对线段树进行单点修改和区间求\(\max\),一共\(n\sqrt{n}\)次移动,总时间复杂度......
  • 2024暑假集训总结 zhz
    留校33天集训期间,本人主要加深了对数据结构(如:线段树,平衡树,可持久化线段树),动态规划(如:背包DP,单调队列DP,状态压缩DP,倍增DP,数据结构优化DP,斜率优化DP,数位DP等等),图论(如:Tarjan算法,树链剖分,LCA的三种实现,强连通分量,最小生成树,瓶颈路),以及计算几何(如:Andrew算法,直线与直线的关系......