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

[ABC213G] Connectivity 2 题解

时间:2024-10-14 21:46:35浏览次数:6  
标签:limits int 题解 sum Connectivity ABC213G tw 复杂度 dis

好好好。


我们设当前处理 \(i\) 的答案,那么最后的图就可以分成两个部分:\(1\) 所在的联通块和其他,根据乘法原理,答案就是它们二者方案的乘积。

设 \(f_s\) 表示集合 \(s\) 中所有点联通时图的情况数,\(g_s\) 表示集合 \(s\) 中所有点不一定联通时图的情况数,则有:

\[ans_i=\sum\limits_{\{1,i\}\in s}f_s\times g_{s'} \]

其中 \(s'\) 表示 \(s\) 相对于 \(\{1,2,\dots,n\}\) 这个集合的补集。预处理 \(f_s,g_s\) 的情况下,该部分时间复杂度为 \(O(n2^n)\)。

那么现在就要求 \(f_s\) 和 \(g_s\) 了。

\(g_s\) 好说,设 \(dis_{i,j}\) 表示 \(i,j\) 间有没有边,则:

\[g_s=2^{\sum\limits_{i\ \in\ s}\sum\limits_{j\ \in\ s}dis_{i,j}} \]

时间复杂度 \(O(n^22^n)\)。

考虑 \(f_s\)。我们暴力出奇迹,强制设一个点 \(v\in s\),将原图划分成两张图,一张有 \(v\),必须连通;一张没 \(v\),不要求连通。这种情况下,我们已经构造出了所有的不连通图情况,那么用 \(g_s\) 减去它,就是 \(f_s\) 的值,即:

\[f_s=g_s-\sum\limits_{t\subsetneq s} f_t\times g_{t'} \]

由于要枚举子集,所以时间复杂度 \(O(3^n)\)。

总体时间复杂度 \(O(3^n+n^22^n)\)。

#include<bits/stdc++.h>
using namespace std;
const int N=20,M=1<<17;
const int p=998244353;
int n,dis[N][N],f[M];
int m,g[M],tw[N*N];
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m,g[0]=1,tw[0]=1;
	for(int i=1,u,v;i<=m;i++)
		cin>>u>>v,dis[u][v]=1,tw[i]=tw[i-1]*2%p;
	for(int s=1,cnt=0;s<(1<<n);s++,cnt=0){
		for(int i=1;i<n;i++)
			if((s>>(i-1))&1)
				for(int j=n;j>i;j--)
					cnt+=((s>>(j-1))&1)*dis[i][j];
		f[s]=g[s]=tw[cnt];int v=log2(s)+1;
		for(int t=(s&(s-1));t;t=((t-1)&s))
			if((1<<(v-1))&t) f[s]=(f[s]-1ll*f[t]*g[s^t]%p+p)%p;
	}for(int i=2,sum=0;i<=n;i++,sum=0){
		for(int s=1;s<(1<<n);s+=2) if((s>>(i-1))&1)
			sum=(sum+1ll*f[s]*g[((1<<n)-1)^s]%p)%p;
		cout<<sum<<"\n";
	}return 0;
} 

标签:limits,int,题解,sum,Connectivity,ABC213G,tw,复杂度,dis
From: https://www.cnblogs.com/chang-an-22-lyh/p/18466214/abc213g-connectivity-2_tj

相关文章

  • 题解:P11132 【MX-X5-T4】「GFOI Round 1」epitaxy
    ProblemLink【MX-X5-T4】「GFOIRound1」epitaxy题目描述给你两个正整数\(n,m\)。定义一个\(1\simn\)的排列\(p\)的价值为所有的\(n-m+1\)个长度为\(m\)的连续子串内最大值的最大公因数。(规定单个数的最大公因数为其自身。)请你求出一个在所有\(1\simn\)......
  • 题解:P9137 [THUPC 2023 初赛] 速战速决
    ProblemLink[THUPC2023初赛]速战速决题目描述题意清晰,不再过多赘述。Solution每张不同的卡是等效的。小\(J\)手上的卡牌只有\(2\)种情况:手上没有相同的牌和有相同的牌。情况\(1\):小\(J\)手上的牌等价于\(1\simn\)(但其实没用),令其手上的牌为\(b_1,b_2,\ldo......
  • 题解:P6299 差别
    ProblemLink差别题目描述给定\(a,b,c,d\),求\(p,q,r,s\)使得\(M\)成为非零最小值。Solution\(M\)的表达式很复杂,把式子拆开有\(16\)个\(4\)次项,不难发现这是一个平方和,不断套平方和公式,最后化简成:\[M=|(ap+bq+cr-ds)^2+(-aq+bp+cs+dr)^2|=((a+bi)\times(......
  • 题解:P9743 「KDOI-06-J」旅行
    ProblemLink「KDOI-06-J」旅行题意题目讲的很清楚,不再过多赘述。Solution不难想到\(O(n^2\timesm^2\timesk)\)的做法:定义\(f_{i,j,val,x,y}\)为当前在\((x,y)\)的位置,花费\(val\)元,手上有\(x\)张\(L\)公司的票,\(y\)张\(Z\)公司的票的方案数,至于空间问题......
  • 题解:P1709 [USACO5.5] 隐藏口令 Hidden Password
    ProblemLink[USACO5.5]隐藏口令HiddenPassword题目描述求最小表示法的开头字母在原字符串的位置。Solution最小表示法板子,双指针解决即可。Code#include<iostream>#include<algorithm>#include<string.h>#include<cstring>#include<cmath>#include<cstdio>......
  • [PA2021] Od deski do deski 题解
    好题好题,难者不会会者不难,我是前者。实际上加入就可以合法的数是很好计算的。考虑现在所有前缀合法串后的字符实际上都可以满足条件。容易想到根据是否合法设置状态。设\(f_{i,j}/g_{i,j}\)表示现在填第\(i\)个数,有\(j\)个填了就合法的数,现在的串合法/不合法。那么有转......
  • 题解:P11145 Strange Homura Game
    ProblemLinkStrangeHomuraGame题意让你猜测一个数\(n\),你只能输出两次,每次输出一个数\(x\),返回\(x\bmodn\)。Solution令输入的数为\(A,B\),输出的数为\(a,b\),答案为\(n\)。一开始想的是CRT,但只能询问\(2\)次。发现输入的值是经过\(\bmodn\)的,已知\((A-a)......
  • 题解:AT_joi2021ho_b 雪玉 (Snowball)
    ProblemLink[JOI2021Final]雪玉题目描述翻译很简洁,不作赘述。Solution对于相邻的两个雪球\(a_i\)和\(a_{i+1}\),两者夹着的区间中的雪要么是被\(a_i\)或\(a_{i+1}\)卷起,要么不可能被清理掉。那么思路非常简单了,对于每个区间,只有\(2\)种情况:区间左侧雪球的最......
  • 题解:P2315 [HNOI2005] 数三角形
    ProblemLink[HNOI2005]数三角形题意输入一个大三角形的各个边存在情况,输出里面有多少个正三角形。Solution简单暴力即可,用\(4\)个数组维护每条边能延伸的最大长度,然后逐个判断三角形是否可行即可。如图,l_upper维护左端点向上(即$\ell_{BA}$),l_lower维护左端点向下(即......
  • 题解:AT_arc120_c [ARC120C] Swaps 2
    ProblemLink[ARC120C]Swaps2\(-1\)的情况判错卡了\(10\)几分钟,麻了。题面翻译给出\(2\)个序列\(a\)和\(b\),定义一次操作为:选定一个下标\(i\),先将\(a_i\)以及\(a_{i+1}\)交换,然后让\(a_i\)加一,最后让\(a_{i+1}\)减一。求最少操作次数使得\(a\)序列等......