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;

浙公网安备 33010602011771号