题解 AT690 【木】
Description
给定一棵大小为
在处理到
若处理到儿子
最后
时空复杂度为
Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2000 + 5, p = 1e9 + 7;
inline int read() {
int X = 0,w = 0; char ch = 0;
while(!isdigit(ch)) {w |= ch == '-';ch = getchar();}
while(isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48),ch = getchar();
return w ? -X : X;
}
struct edge{
int to, nxt;
}e[N];
int head[N], tot;
void addedge(int x, int y) {
e[++tot].to = y, e[tot].nxt = head[x], head[x] = tot;
}
int c[N][N], f[N], sz[N], n, ans;
void dfs(int x, int fa) {
f[x] = 1, sz[x] = 0;
for (int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
if (y != fa) {
dfs(y, x); sz[x] += sz[y];
f[x] = f[x] * f[y] % p * c[sz[x]][sz[y]] % p;
}
}
sz[x]++;
}
int ksm(int a, int k) {
int res = 1;
while (k) {
if (k & 1) res = res * a % p;
a = a * a % p;
k >>= 1;
}
return res % p;
}
signed main() {
n = read();
for (int i = 1; i < n; i++) {
int x = read(), y = read();
addedge(x, y), addedge(y, x);
}
for (int i = 0; i <= n; i++) {
c[i][0] = c[i][i] = 1;
for (int j = 1; j < i; j++) c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % p;
}
for (int i = 1; i <= n; i++) {
dfs(i, -1); ans = (ans + f[i]) % p;
}
printf("%lld\n", ans * ksm(2, p - 2) % p);
return 0;
}