题解:P13020 [GESP202506 八级] 遍历计数
关于我在考场上乱搞换根
分析题意
很明显,题目中所谓的遇到新的点就写下编号这一步其实就是
从一个点切入
首先这个题目不限定初始节点就很难受,即使我们能
最终正解
现在我们解决了一个点为根时的问题,那么怎么解决所有问题呢?
我们从树的性质入手,一颗树除根节点以外都有父亲节点,所以非根个节点子节点个数就等于其度数减
代码
#include <bits/stdc++.h>
#define N 100010
#define mod 1000000000
#define ll long long
using namespace std;
int n;
ll deg[N];
ll prod = 1, sum;
ll p[N];
int main()
{
cin >> n;
if (n == 1) return (puts("1"), 0);
static int u, v;
p[0] = 1;
for (int i = 1; i < n; i++) cin >> u >> v, deg[u]++, deg[v]++, p[i] = (p[i - 1] * i) % mod;
for (int i = 1; i <= n; i++) prod = (prod * p[deg[i] - 1]) % mod, sum = (sum + deg[i]) % mod;
cout << (prod * sum) % mod;
return 0;
}
最后,一定要注意特判 n == 1的情况,否则你会因为子节点个数被减到