考虑 ( t DP),朴素的想法是令 (f_S) 表示 (S) 这个导出子图将边定向集合构成 ( t DAG) 的方案数。
转移可以考虑剥去所有入度为 (0) 的点,那么我们就需要得到仅存在 (T) 这个子集为 (S) 中入度为 (0) 的点的方法。
直接做是困难的,考虑容斥。
强制钦定 (T) 这个子集为 (S) 中入度为 (0) 的点,其他的点不管,(T ightarrow S - T) 的边显然可以连或不连,而 (S - T ightarrow T) 中间的边必须强制不连,这样可以得到转移:
[f_S = sumlimits_{T subseteq S, T
e varnothing} 2 ^ {ways(T, S - T)} imes f_{S - T}
]
令 (q_T = 2 ^ {ways(T, S - T)} imes f_{S - T}),令 (S) 中恰好仅有 (T) 做为入度为 (0) 的点的方案为 (p_T),那么有:
[q_T = sumlimits_{T subseteq S} p_S
]
根据二项式反演的集合形式,有:
[p_S = sumlimits_{S subseteq T} (-1) ^ {|T|} q_T
]
在本题中,我们需要求:
[egin{aligned}
& sumlimits_{T subseteq S, T
e varnothing} p_T \
&= sumlimits_{T subseteq S, T
e varnothing} sumlimits_{T subseteq R, R subseteq S} (-1) ^ {|R|} q_R \
&= sumlimits_{T subseteq S} (-1) ^ {|T| - 1} q_T
end{aligned}
]
因此有 (f) 的转移:
[f_S = sumlimits_{T subseteq S, T
e varnothing} (-1) ^ {|T| - 1} imes 2 ^ {ways(T, S - T)} imes f_{S - T}
]
此时只要处理出 (ways(T, S - T)) 即可做到 (mathcal{O}(3 ^ n))。
对于每个 (S),我们考虑单独计算 (ways(T, S - T)(T subseteq S)),将其简写为 (w_T)。
对 (w_T) 进行 ( t DP),显然每次只需取出一个在 (T) 中的点进行转移即可,可以使用 (mathtt{lowbit}, mathcal{O}(1)) 取出。
转移只需预处理出 (w1_{i, S}, w2_{i, S}) 分别表示 (i ightarrow S) 中的边数和 (S ightarrow i) 中的边数即可,这部分直接暴力。
于是本题可以做到时间复杂度 (mathcal{O}(3 ^ n)),空间复杂度 (mathcal{O}(n imes 2 ^ n))。