P6651

· · 题解

题目描述

给定n个点,m条边的有向无环图。不保证图联通。

q$次询问,每次给出$k$和$k$个互不相同的数$c_i

,求出如果去掉这k个点,整个有向无环图将剩余多少条链。答案对10^9+7取模。每次询问独立。

数据范围

对于100\%的数据:2\leq n\leq 2\times 10^31\leq m\leq \min(\frac{n\times(n-1)}{2},2\times 10^4)1\leq q\leq 5\times 10^5

所有询问满足:1\leq \sum k\leq 2\times 10^60\leq k\leq \min(n,15)1\leq c_i\leq n。保证 c_i互不相同。

题目分析

Subtask1

很明显,如果 k=0 就只有一条链,否则就没有。

Subtask2-3

标记删掉的点,暴力去跑图。

f_i表示以i结尾的链数,转移显然:

∀(u,v),f_v\leftarrow f_u+f_v

时间复杂度O(qm)

Subtask4

拿样例作分析: ![](https://cdn.luogu.com.cn/upload/image_hosting/2gbdoemh.png) 入度为$0$的点是$3$,出度为$0$的点是$5$。手玩找出$f_i$。

\begin{matrix} i & 1 & 2 & 3 & 4 & 5 & 6 & 7\ f_i & 1 & 2 & 1 & 6 & 13 & 4 & 1 \end{matrix}

再找出每个点到出度为$0$的点的方案数$n\!f_i$。

\begin{matrix} i & 1 & 2 & 3 & 4 & 5 & 6 & 7\ n!f_i & 3 & 3 & 13 & 1 & 1 & 2 & 4 \end{matrix}

手玩答案后汇总得:

\begin{matrix} i & 1 & 2 & 3 & 4 & 5 & 6 & 7\ f_i & 1 & 2 & 1 & 6 & 13 & 4 & 1\ n!f_i & 3 & 3 & 13 & 1 & 1 & 2 & 4\ ans_i & 10 & 7 & 0 & 7 & 0 & 5 & 9 \end{matrix}

设$s$为出度为$0$的$f_i$的和,发现$ans_i=s-f_i\times n\!f_i$。 $O(m)$预处理,$O(1)$查询,总复杂度$O(q+m)$。 #### $Subtask5

对于k=2,直接用 ans=s-f_i\times n\!f_i-f_j\times n\!f_j计算可能会出问题,因为同时经过i,j的链会被重复计算,考虑两点容斥。

d_{i,j}表示在原图上i \to j的方案数,还是通过样例:

\begin{matrix} d_{i,j} & 1 & 2 & 3 & 4 & 5 & 6 & 7 & i\\ 1 & 1 & 0 & 0 & 2 & 3 & 1 & 0 & \\ 2 & 0 & 1 & 0 & 1 & 3 & 1 & 0 & \\ 3 & 1 & 2 & 1 & 6 & 13 & 4 & 1 & \\ 4 & 0 & 0 & 0 & 1 & 1 & 0 & 0 & \\ 5 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & \\ 6 & 0 & 0 & 0 & 1 & 2 & 1 & 0 & \\ 7 & 0 & 1 & 0 & 2 & 4 & 1 & 1 & \\ j & \end{matrix}

可以发现一个性质:若 i\ne j,则 d_{i,j}\times d_{j,i}=0显然成立。

所以,总计算式为:

ans=s-(f_i-f_j\times d_{j,i})\times n\!f_i - (f_j - f_i \times d_{i,j})\times n\!f_j #### $Subtask6

到此,思路已经全部出来了,将k=2的情况扩展。对所有删去的点的每个点对 (i,j),如果i能到达j,就往i\to j连一条的边,然后再拓扑排序一遍:对于每个点i的出边 pf_p\leftarrow f_p-f_i\times d_{i,p} 。最后统计答案,即

ans=s-\sum\limits_{i=1}^kf_{c_i}\times n\!f_{c_i}

这个可以通过预处理拓扑序避免每次询问再跑一遍拓扑,即根据拓扑序排序后进行容斥。

## [参考代码](https://www.luogu.com.cn/paste/2xoqfn83)