#include <iostream>
#include <vector>
#include <functional>
using namespace std;
using i64 = long long;
constexpr int P = 1E9 + 7;
i64 power(i64 a, int b) {
i64 res = 1;
for (a %= P; b; b /= 2, a = a * a % P) {
if (b % 2) {
res = res * a % P;
}
}
return res;
}
int main() {
int n, r;
cin >> n >> r;
vector<vector<int>> adj(n + 1);
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
vector<int> tr(n + 5), sz(n + 1);
auto add = [&] (int p, int v) {
for (; p <= n; p += p & -p) {
tr[p] += v;
}
};
auto ask = [&] (int p) {
int ret = 0;
for (; p > 0; p -= p & -p) {
ret += tr[p];
}
return ret;
};
int s = 1, cnt1 = 0, cnt2 = 0;
function<void(int, int)> dfs = [&] (int u, int fa) {
cnt1 = (cnt1 + ask(n) - ask(u)) % P;
add(u, 1);
int cnt = 0;
for (auto v : adj[u]) {
if (v != fa) {
dfs(v, u);
sz[u] += sz[v];
cnt++;
}
}
for (int i = 1; i <= cnt; i++) {
s = (1LL * s * i) % P;
}
cnt2 = (cnt2 + n - ask(n) - sz[u]) % P;
sz[u] += 1;
add(u, -1);
};
dfs(r, -1);
cout << (1LL * cnt1 * s % P + 1LL * cnt2 * s % P * power(4, P - 2) % P) % P;
return 0;
}
PTA L3-032 关于深度优先搜索和逆序对的题应该不会很难吧这件事
于 2023-04-17 20:49:36 首次发布