CF762F
其实这个题也不是很复杂。
首先题目背景里说的是一个联通子图!!!
发现数据范围其实不是很大,我们不妨钦定一个节点为根 S S S 的节点。那么本质上对于 S S S 中的每一个节点我们都需要对 T T T 进行一次匹配。
显然因为是联通子图是不可能进行树哈希的,我们考虑进行树形 D p Dp Dp。
不妨考虑设 f ( u , v , S ) f(u, v, S) f(u,v,S) 表示对于 u ∈ S , v ∈ T u \in S, v \in T u∈S,v∈T 的情况,已经匹配了 T T T 中集合 S S S 的方案数。
但是题目中说明的是无根树,如果再对于 T T T 钦定一个根的话会产生有些形态没有计算的情况。
所以我们不得不考虑重复计算的情况,也就是一个情况能计算几次。本质就是一个和 T T T 本质相同的树会被计算几次。
这两个相除即可。
#include <bits/stdc++.h>
using namespace std;
#define Fread
#define Getmod
#ifdef Fread
char buf[1 << 21], *iS, *iT;
#define gc() (iS == iT ? (iT = (iS = buf) + fread (buf, 1, 1 << 21, stdin), (iS == iT ? EOF : *iS ++)) : *iS ++)
#define getchar gc
#endif // Fread
template <typename T>
void r1(T &x) {
x = 0;
char c(getchar());
int f(1);
for(