cf1172 B. Nauuo and Circle(排列组合)

题意:

已知一棵有n个顶点的树。你要把树的所有顶点放在一个环上,要求顶点不能重叠且所有边不相交(当然在端点处可以相交)。然后任选一个点作为起点开始顺时针点数,可以得到一个n的排列。问不同的排列有多少种。

思路:

\(root\) 为根节点,\(u_i\)\(root\) 的儿子们。\(tr(x)\) 表示以 \(x\) 为根的树。

对每个 \(u_i\)\(tr(u_i)\) 的所有点在环上一定是在一起的。

先不选起点。先放置 \(root,tr(u_1), tr(u_2),\cdots,tr(u_{deg[root]})\) 。注意 \(n\) 个点的环排列数为 \(n!/n=(n-1)!\),所以方案数为 \((deg[root]+1-1)!=(deg[root])!\)

然后看某个 \(tr(u_i)\) 怎样放置。设 \(u_i\) 的儿子为 \(v_j\) ,放置 \(u_i,tr(v_1),tr(v_2),\cdots ,tr(v_{deg[u_i]-1})\) ,共 \(deg[u_i]\) 个点。注意这时不用环排列数,应该是正常排列数 \((deg[u_i])!\)

上面的结果相乘,就是 \(\sum\limits_{i=1}^{n}(deg[i])!\) 。最后任选一点为起点,乘个 \(n\)

ll ans = n;
for(int i = 1; i <= n; i++) (ans *= jie[deg[i]]) %= mod;
cout << ans;
posted @ 2021-12-24 15:58  Bellala  阅读(46)  评论(0)    收藏  举报