\(\mathcal{Description}\)

  Link.

  给定简单无向图 \(G=(V,E)\),点的编号从 \(1\) 到 \(|V|=n\)。对于 \(k=2..n\),求 \(H=(V,E'\subseteq E)\) 的个数,使得 \(1\) 与 \(k\) 连通。

  \(n\le17\)。

\(\mathcal{Solution}\)

  一种在状压 DP 子集枚举时的去重 trick√

  令 \(f(S)\) 表示仅考虑点集 \(S\) 的导出子图时,使得点集 \(S\) 连通的选边方案数。设 \(\operatorname{inc}(S)\) 表示点集 \(S\) 的导出子图的边数,考虑一个错误的转移:

\[f(S)=2^{\operatorname{inc}(S)}-\sum_{T\subsetneq S}2^{\operatorname{inc}(S\setminus T)}f(T)
\]

由于在非法方案中,点集 \(S\) 可能包含多个极大连通块,所以这样转移会算重。但我们可以钦定某个特殊结点 \(u\in S\),仅考虑包含 \(u\) 的连通块和除这个连通块的其余部分,就能避免重复计数,得到转移

\[f(S)=2^{\operatorname{inc}(S)}-\sum_{T\subsetneq S,u\in T}2^{\operatorname{inc}(S\setminus T)}f(T)
\]

  求出 \(f\) 之后就能随便求得答案了。复杂度 \(\mathcal O(3^n)\),可用 FWT 优化。

\(\mathcal{Code}\)

/*~Rainybunny~*/

#include <cstdio>

#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) const int MAXN = 17, MAXM = 136, MOD = 998244353;
int n, m, pwr[MAXM + 5], inc[1 << MAXN], ans[MAXN + 5], f[1 << MAXN]; inline void subeq( int& a, const int b ) { ( a -= b ) < 0 && ( a += MOD ); }
inline int mul( const int a, const int b ) { return int( 1ll * a * b % MOD ); }
inline void addeq( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD ); } int main() {
scanf( "%d %d", &n, &m ), pwr[0] = 1;
rep ( i, 1, m ) {
addeq( pwr[i] = pwr[i - 1], pwr[i - 1] );
int u, v; scanf( "%d %d", &u, &v ), --u, --v;
rep ( S, 0, ( 1 << n ) - 1 ) inc[S] += S >> u & 1 && S >> v & 1;
}
rep ( S, 0, ( 1 << n ) - 1 ) {
int& cur = f[S] = pwr[inc[S]];
for ( int T = S & ( S - 1 ); T; T = ( T - 1 ) & S ) if ( T & S & -S ) {
subeq( cur, mul( f[T], pwr[inc[S ^ T]] ) );
}
if ( !( S & 1 ) ) continue;
int v = mul( f[S], pwr[inc[( ( 1 << n ) - 1 ) ^ S]] );
rep ( i, 1, n - 1 ) if ( S >> i & 1 ) addeq( ans[i], v );
}
rep ( i, 1, n - 1 ) printf( "%d\n", ans[i] );
return 0;
}

Solution -「ABC 213G」Connectivity 2的更多相关文章

  1. Solution -「ABC 219H」Candles

    \(\mathcal{Description}\)   Link.   有 \(n\) 支蜡烛,第 \(i\) 支的坐标为 \(x_i\),初始长度为 \(a_i\),每单位时间燃烧变短 \(1\) ...

  2. Solution -「ABC 215H」Cabbage Master

    \(\mathcal{Description}\)   Link.   有 \(n\) 种颜色的,第 \(i\) 种有 \(a_i\) 个,任意两球互不相同.还有 \(m\) 个盒子,每个盒子可以被放 ...

  3. Solution -「ABC 213H」Stroll

    \(\mathcal{Description}\)   Link.   给定一个含 \(n\) 个结点 \(m\) 条边的简单无向图,每条边的边权是一个常数项为 \(0\) 的 \(T\) 次多项式, ...

  4. Solution -「ABC 217」题解

    D - Cutting Woods 记录每一个切割点,每次求前驱后驱就好了,注意简单判断一下开闭区间. 考场上采用的 FHQ_Treap 无脑莽. #include <cstdio> #i ...

  5. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  6. Solution Set -「ABC 217」

      大家好屑兔子又来啦! [A - Lexicographic Order]   说个笑话,\(\color{black}{\text{W}}\color{red}{\text{alkingDead} ...

  7. Solution -「ARC 110E」Shorten ABC

    \(\mathcal{Description}\)   Link.   给定长度为 \(n\),包含 A, B, C 三种字符的字符串 \(S\),定义一次操作为将其中相邻两个不相同的字符替换为字符集 ...

  8. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  9. Solution -「BZOJ 3812」主旋律

    \(\mathcal{Description}\)   Link.   给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...

随机推荐

  1. a href 鼠标滑过变成小手图标

    <a id="l05" style="cursor:pointer;text-decoration:none;" href="<%=pat ...

  2. SYCOJ411

    题面描述 MasMas在面试某大厂时遇到了一道有趣的题.面试官要求MasMas写一个程序找出几个数中,出现次数为奇数的那个数.MasMas抓耳挠腮,请你帮帮他. 输入描述 第一行输入一个数nn (1 ...

  3. 洛谷 CF196A 题解

    题目传送门 题目描述: 读入字符串,求该串的最大字典序子序列. 我的思路: 循环判断只要当前字符比后面所有的字符的字典序大,就把这个字符存到另一个字符串中,最后和输入的字符串循环比较如果该字符和输入时 ...

  4. 【刷题-PAT】A1119 Pre- and Post-order Traversals (30 分)

    1119 Pre- and Post-order Traversals (30 分) Suppose that all the keys in a binary tree are distinct p ...

  5. gorm中的高级查询

    智能选择字段 GORM 允许通过 Select 方法选择特定的字段,如果您在应用程序中经常使用此功能,你也可以定义一个较小的结构体,以实现调用 API 时自动选择特定的字段,例如: type User ...

  6. 返回值List是JsonArray

    MyController中: index.jsp中

  7. Nginx全面介绍 什么是Nginx?

    目录 一:Nginx全面讲解 1.简介: 2.nginx的用武之地 3.关于代理(解析含义作用) 二:正向代理 三:反向代理 四:项目应用场景 五:正向代理与反向代理区别 1.正向代理 2.反向代理 ...

  8. [HZOI] 山海经 题解

    0.题目大意 给出一个序列,每次查询一个区间的最大子段和的端点和值.序列长度 \(n \le 10^{5}\) . 1.思路 显然应该使用线段树.题目要求每次求一个区间的最大子段和,那么在线段树节点中 ...

  9. 学习Java第12天

    今天所做的工作: 敲代码,按照教材进度,我已经"学完了",用引号引起来. 明天工作安排: 开始学习前台技术,边复习Java基础. 今日总结:Eclipse基本使用方法 Ctrl+A ...

  10. Stream流的基本介绍以及在工作中的常用操作(去重、排序以及数学运算等)

    平时工作中,我在处理集合的时候,总是会用到各种流操作,但是往往在处理一些较为复杂的集合时,还是会出现无法灵活运用api的场景,这篇文章的目的,主要是为介绍一些工作中使用流时的常用操作,例如去重.排序和 ...