bzoj #2863. 愤怒的元首

发布时间 2023-10-28 20:19:03作者: FOX_konata

bzoj #2863

  • \(dp_i\) 表示 \(i\) 个点的 DAG 个数。发现一个 DAG 删去出度为 \(0\) 的点后显然还是一个 DAG ,因此不妨枚举出度为 \(0\) 的点的个数: \(dp_i = \sum\limits_{j=1}^i dp_{i-j}\binom{i}{j}2^{j(i-j)}\)
  • 这么干显然不太对,因为我们不能保证每次删除时都能把图中的所有出度为 \(0\) 的点删完,换言之,我们后面这个式子求的是至少有 \(j\) 个出度为 \(0\) 的点的方案数,而我们想要求恰好,显然容斥原理
  • 我们设 \(f_j\) 表示恰好有 \(j\) 个出度为 \(0\) 的点方案数, \(g_i\) 表示至少有 \(j\) 个出度为 \(0\) 的点方案数,根据广义容斥,可以知道:

\[g_i = \sum\limits_{j=i}^{n} \binom{j}{i} f_j \Leftrightarrow f_i = \sum\limits_{j=i}^{n} (-1)^{j-i} \binom{j}{i} g_j \]

  • \(dp_i = \sum\limits_{j=1}^{i} f_i\) ,因此:

\[\begin{align} dp_i &= \sum_{j=1}^{i} f_j \\ &= \sum_{j=1}^{i} \sum_{k=j}^{i} (-1)^{k-j} \binom{k}{j} g_k \\ &= \sum_{j=1}^{i} \sum_{k=j}^{i} (-1)^{k-j} \binom{k}{j} dp_{i-k}\binom{i}{k}2^{k(i-k)} \\ &= \sum_{k=1}^{i} \sum_{j=1}^{k} (-1)^{k-j} \binom{k}{j} dp_{i-k}\binom{i}{k}2^{k(i-k)} \\ &= \sum_{k=1}^{i} \binom{i}{k} 2^{k(i-k)} dp_{i-k} \sum_{j=1}^{k} (-1)^{k-j} \binom{k}{j} \\ &= \sum_{k=1}^{i} \binom{i}{k} 2^{k(i-k)} dp_{i-k} (0-(-1)^j) \\ &= \sum_{k=1}^{i} (-1)^{j+1} \binom{i}{k} 2^{k(i-k)} dp_{i-k} \\ \end{align} \]

  • 还有一种理解思路:根据容斥原理, \(|\cup_{i=1}^n A_i|=\sum_{i=1}^{n} (-1)^{i+1} \sum_S |\cap_{x \in S} A_x|\) ,因此直接容斥就可以
  • 最终复杂度 \(O(n)\)