题目传送门
分析:
我们设恰好\(k\)条边不重复的方案数为\(f(k)\)
再设钦定\(n-k-1\)条边与原来树上的边重合,剩下的边自由连接成树的方案数\(g(k)\)
于是得到一个公式:
\[g(k)=\sum_{i=0}^{k}\binom{k}{i}f(i) \]
意义为枚举剩下的\(K\)条边有哪些不重合
于是我们二项式反演:
\[f(k)=\sum_{i=0}^{k}(-1)^{k-i}\binom{k}{i}g(i) \]
知道了\(g\)我们就可以\(O(n^2)\)求\(f\)
考虑\(g(k)\)之中会有\(k+1\)个连通块,那么生成树的方案数为
\[n^{k-1}\prod_{i=1}^{k+1}a_i \]
其中\(a_i\)表示每个连通块的大小,即在此连通块里选择一个点向其他连通块连边
我们想知道\(\prod_{i=1}^{k+1}a_i\)在所有情况下的总和
考虑\(DP\)
设\(f[u][i][0/1]\)表示在\(u\)为根的子树下,已经钦定\(sz[u]-i-1\)条边,\(u\)所在连通块是否已选择了一个点
列出\(DP\)式子
设\(g[i][0/1]\)为传递给下一次\(DP\)的临时变量
\(g[j+k][0]=f[u][j][0]*f[v][k][0]\)钦定这条父子边,\(u,v\)属于同一连通块未被选择
\(g[j+k][1]=f[u][j][0]*f[v][k][1]+f[u][j][1]*f[v][k][0]\)钦定这条父子边,\(u,v\)属于同一连通块其中被选择
\(g[j+k+1][0]=f[u][j][0]*f[v][k][1]\)不钦定这条父子边,\(u,v\)不属于同一连通块,\(v\)必须被选择,\(u\)继承原来的状态
\(g[j+k+1][1]=f[u][j][1]*f[v][k][1]\)不钦定这条父子边,\(u,v\)不属于同一连通块,\(v\)必须被选择,\(u\)继承原来的状态
总复杂度为\(O(n^2)\)
#include
#include
#include
#include
#include
#include
#include