CF1667E
以 \(1\) 为根,那么所有节点 \(i\) 的父亲就是节点编号小于 \(i\) 的任意一个节点。
这时节点 \(i\) 成为根的必要条件是 \(i\) 的子树大小 \(\geq \frac{n+1}{2}\)。
设 \(f_i\) 表示 \(i\) 子树大小 \(\geq \frac{n+1}{2}\) 的方案数。
令 \(m=\frac{n+1}{2}\)
如果 \(i=1\),\(f_i=(n-1)!\)
如果 \(i>1\),有:
\[\begin{aligned}
f_i&=\sum_{j=m}^{n-i+1}{{n-i}\choose{j-1}}(n-j-1)!(i-1)(j-1)!\\
&=\sum_{j=m}^{n-i+1}\frac{(n-i)!}{(j-1)!(n-i-j+1)!}(n-j-1)!(i-1)(j-1)!\\
&=(n-i)!(i-1)\sum_{j=m}^{n-i+1}\frac{(n-j-1)!}{(n-i-j+1)!}\\
&=(n-i)!(i-1)!\sum_{j=m}^{n-i+1}{{n-j-1}\choose{n-i-j+1}}\\
&=(n-i)!(i-1)!\sum_{k=0}^{n-i-m+1}{{i-2+k}\choose{k}}\\
&=(n-i)!(i-1)!{{n-m}\choose{n-i-m+1}}
\end{aligned}
\]
对原始式子的理解:
枚举子树大小 \(j\),从 \(>i\) 的 \(n-i\) 个数中选出 \(j-1\) 个数放到 \(i\) 子树内的方案数为 \({{n-i}\choose{j-1}}\),在剩余 \(n-j\) 个点中,编号第 \(k\) 大的点有 \(n-j-k\) 种选父亲的方案,那么总方案是 \((n-j-1)!\),节点 \(i\) 的父亲有 \(i-1\) 种选择,\(i\) 子树内的点编号第 \(k\) 大的有 \(j-1\) 种父亲的选择,因此总方案数为 \((j-1)!\)。
因此我们可以 \(\mathcal{O}(n)\) 预处理出 \(f_i\)。
但 \(f_i\) 并不表示 \(i\) 为重心的方案数,这种情况当且仅当 \(i\) 的儿子中有一个儿子的子树 \(\geq m\)(并且这个儿子也只会有一个),那么枚举 \(v>i\),减掉 \(v\) 子树 \(\geq m\) 且 \(v\) 的父亲是 \(i\) 的方案数,,即 \(\frac{f_v}{v-1}\)。
所以 \(ans_i=f_i-\sum_{v>i}\frac{f_v}{v-1}\),对 \(f\) 做一个后缀和就行了。
浙公网安备 33010602011771号