首页 > 其他分享 >[ABC213G] Connectivity 2 题解

[ABC213G] Connectivity 2 题解

时间:2024-10-15 21:49:40浏览次数:7  
标签:sta int 题解 ++ Connectivity ABC213G mp ans

[ABC213G] Connectivity 2 题解

套路的经典图上计数题。

考虑枚举和 \(1\) 相连的子集 \(S\)。答案显然由两部分构成,\(S\) 集合和 \(1\) 相连的方案数 \(f(S)\) 和 \(S\) 对于 \(G\) 的补集所有的方案数 \(g(S)\)。答案就是二者相乘。

显然 \(g\) 更好处理。直接枚举集合的边即可。对于 \(f\),图上计数问题不好处理的话通常考虑容斥,所有方案数显然是 \(g(S)\),不相连的方案数常见的套路是钦定联通块 \(T\) 与 \(1\) 相连,记 \(T\) 关于 \(S\) 的补集是 \(P\),令 \(P\) 与 \(1\) 不相连,那么 \(f(S)=g(S)-\sum f(T)\times g(P)\)。

时间复杂度上瓶颈是枚举 \(2^n\) 的子集,是 \(O(3^n)\) 的。

代码:

#include <bits/stdc++.h>
#define N 17
#define int long long
#define mod 998244353
using namespace std;
int n, m;
int mp[N][N];
int f[(1 << N) + 2], g[(1 << N) + 2];
int qpow(int x, int y) {
	int ans = 1;
	while (y) {
		if (y & 1)
			ans = ans * x % mod;
		x = x * x % mod;
		y >>= 1;
	}
	return ans;
}
int ans[N];
signed main() {
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		int x, y;
		cin >> x >> y;
		--x, --y;
		mp[x][y] = mp[y][x] = 1;
	}
	for (int sta = 0; sta < (1 << n); sta++) {
		for (int i = 0; i < n; i++)
			if ((sta >> i) & 1)
				for (int j = i + 1; j < n; j++)
					if (((sta >> j) & 1) && mp[i][j])
						g[sta]++;
		g[sta] = qpow(2, g[sta]);
	}
	f[1] = 1;
	for (int sta = 3; sta < (1 << n); sta += 2) {
		for (int stb = (sta - 1) & sta; stb; stb = (stb - 1) & sta) 
			f[sta] = (f[sta] + f[stb] * g[sta ^ stb] % mod) % mod;
		f[sta] = (g[sta] - f[sta] + mod) % mod;
	}
	for (int sta = 1; sta < (1 << n); sta++) {
		f[sta] = f[sta] * g[((1 << n) - 1) ^ sta] % mod;
		for (int i = 0; i < n; i++)
			if ((sta >> i) & 1)
				ans[i] = (ans[i] + f[sta]) % mod;		
	}
	for (int i = 1; i < n; i++)
		cout << ans[i] << "\n";
	return 0;	
} 

标签:sta,int,题解,++,Connectivity,ABC213G,mp,ans
From: https://www.cnblogs.com/Rock-N-Roll/p/18468570

相关文章

  • P8386 [PA2021] Od deski do desk 题解
    P8386[PA2021]Oddeskidodesk题解考虑一个大的序列一定被分成几个区间来删除。朴素的dp定义是\(dp_{i,j}\)表示前\(i\)个数,最后一个数元素是\(j\)的方案数。然而这样不仅不好转移,而且设不下状态。不难发现所有值是等价的。考虑这样一个事情:若我们要分出一个新的区......
  • Project Euler 638 题解
    q-analog,老玩家集体起立!这也就是说:\[\binom{n+m}{n}_q=\sum_{\pi\inL_{n,m}}q^{area(\pi)}\]结束!#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintmod=1e9+7,maxn=2e7+5;intqp(inta,intb,intp=mod){ intres=1; while(b){ i......
  • 2024某校新生校队选拔赛题解
    游记某校某院与某院联合培养机制给排了两场讲座,讲完吃饭,讲座时间\(8:00-12:00,\)拖堂\(10\)min,到食堂\(10\)min,吃饭\(30\)min,走回去\(10\)min,打开网址发现时间只够看榜的一看榜我草\(5\)小时连\(4\)个题都做不出来翻题面发现A,L纯签到,B半签到,遂确信成分题解题目链接A验证是......
  • Project Euler 457 题解
    初等数论小题目求\[n^2-3n-1\equiv0\pmod{p^2}\]配方,得到:\[(2n-3)^2\equiv13\pmod{p^2}\]根据亨泽尔引理,只需得到\((2n-3)^2\equiv13\pmod{p}\)的解即可提升到\(p^2\)。这是二次剩余,直接解。单次求解\(O(\logn)\),时间复杂度\(O(n)\)。#include<bits/stdc++.h......
  • TopCoder SRM616 ColorfulCoins 题解
    TopCoderSRM616ColorfulCoins题意给一套货币,保证任意两种货币存在倍数关系且颜色互不相同。已知货币的币值集合,每次可以询问一个金额,给出货币张数最小的表示方案。问最小的询问次数,使得通过已知信息可以对应货币面值和颜色。分析最大的面值问一个\(\inf\)即可。这时只需要......
  • [ABC062C]/[ARC074A] Chocolate Bar 题解
    神秘分讨题(?总共\(4\)中情况。第一种:三个竖的并列:ans=min(ans,(h%3>0)*w);。第二种:三个横的并列:ans=min(ans,(w%3>0)*h);。第三种:一个横的矩形,然后是两个竖着的。For(i,1,h){ intfst=i*w; intscd=(w/2)*(h-i); intthd=(w%2>0)*(h-i)+(w/2)*(h-i); ans=min(ans......
  • 堆排序题解
    给定一个整数序列,请按非递减序输出采用堆排序的各趟排序后的结果。输入格式:测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。输出格式:对于每组测试,输出若干行,每行是一趟排序后的结果,每行的每两个数据之间留一个空格。输入样例......
  • 「题解」Educational Codeforces Round 170 (Rated for Div. 2)
    before我不想写作业呜呜。A.TwoScreensProblemA.TwoScreensSol&Code理解题意后发现使用复制的方法完成最长公共前缀即可。#include<bits/stdc++.h>typedeflonglongll;typedefstd::pair<int,int>pii;intT;std::strings1,s2;intmain(){scanf("%d"......
  • CF1955G GCD on a grid 题解
    洛谷链接我们暴力枚举可能的答案\(k\),然后跑一边dp。设\(f_{i,j}\)表示在格子\((i,j)\)是否可以满足有一条路径可以到达该格子且该格子是否为\(k\)的倍数,递推式即为\(f_{i,j}=(k\mida_{i,j}\operatorname{and}(f_{i-1,j}\operatorname{or}f_{i,j-1}))\)最后的答......
  • ARC156C 题解
    blog。显然答案为\(0\)不行。打表发现最优答案总为\(1\)。考虑构造取到\(1\)的下界。观察到,\(\text{LCS}\le1\)等价于去掉两序列都不存在的数后,两序列完全相反。于是有:在\(\{x\},\{y\}\)后增加两序列都不存在的数,不影响LCS。进行\(\{x\}\to\{a,x,b\},\{y\}\to\{b,......