典中典图计数问题
一、无向图定向
问题描述:给定一张 \(n\) 个点,\(m\) 条边的的无向图,求给每条边定向后是 DAG 的方案数,对 \(998244353\) 取模。
数据范围:\(1 \le n \le 20\)。
设 \(f_S\) 表示 \(S\) 点集中的点在 DAG 上时的方案数,枚举出度为 \(0\) 的点集 \(T\),\(g(S)\) 表示 \(S\) 能否成为出度为 \(0\) 的点集,当且仅当 \(S\) 内没有边时为 \(1\),否则为 \(0\)。
直接做是 \(\mathcal{O}(3 ^ n)\),利用子集卷积可以做到 \(\mathcal{O}(2 ^ n \cdot n ^ 2)\)。
Trick:转移方程看似是需要在线的,但是由于是按 \(S\) 从小到大转移,而子集卷积恰好可以按 \(\operatorname{popcount}(S)\) 从小到大卷,所以能够做到 \(\mathcal{O}(2 ^ n \cdot n ^ 2)\)。
二、DAG 计数
问题描述:对 \(n\) 个点带标号的 DAG 进行计数,对 \(998244353\) 取模。
数据范围:\(1 \le n \le 5 \times 10 ^ 3\)。
设 \(f_i\) 表示 \(i\) 个点带标号的 DAG 数量,转移就每次枚举出度为 \(0\) 的点集。
由于每次枚举出度为 \(0\) 的点集 \(T\) 时,将所有 \(T \subseteq S\) 计算了一遍,所以需要容斥,时间复杂度 \(\mathcal{O(n ^ 2)}\)。
Trick:可以将 \(j(i - j)\) 拆成 \(\binom{i}{2} - \binom{j}{2} - \binom{i - j}{2}\),然后分治 NTT 或者多项式求逆。