参考程序:
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1e5 + 5;
const int mod = 1e9;
int n, deg[N], fac[N];
int pre[N], suf[N];
int ans;
int main() {
scanf("%d", &n);
// 预处理阶乘
fac[0] = 1;
for (int i = 1; i <= n; i++)
fac[i] = 1ll * fac[i - 1] * i % mod;
// 统计每个节点的度
for (int i = 1; i < n; i++) {
int u, v;
scanf("%d%d", &u, &v);
deg[u]++;
deg[v]++;
}
// pre[i] 表示 1~i 的 (deg[j]-1)! 连乘积
pre[0] = 1;
for (int i = 1; i <= n; i++)
pre[i] = 1ll * pre[i - 1] * fac[deg[i] - 1] % mod;
// suf[i] 表示 i~n 的 (deg[j]-1)! 连乘积
suf[n + 1] = 1;
for (int i = n; i >= 1; i--)
suf[i] = 1ll * suf[i + 1] * fac[deg[i] - 1] % mod;
// 枚举每个起点 i:
// pre[i - 1] 是左侧节点的乘积
// fac[deg[i]] 是当前起点的贡献(整个 deg[i]!)
// suf[i + 1] 是右侧节点的乘积
for (int i = 1; i <= n; i++)
ans = (ans + 1ll * pre[i - 1] * fac[deg[i]] % mod * suf[i + 1]) % mod;
printf("%d\n", ans);
return 0;
}