ESP2025年6月认证C++八级( 第三部分编程题(2)遍历计数)
参考程序:
#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;
}