Submission
Status:
(PPPPPPPPPP)(PPPPPPPPPPPP)(PPPPPPP)(PPPP)(PPPPPPP)(PPPPPPP)
Subtask/Task Score:
{4/4}{14/14}{12/12}{7/7}{20/20}{43/43}
Score: 100
User: Dormon
Problemset: อพยพปลอดภัย (Quartet)
Language: cpp
Time: 0.079 second
Submitted On: 2025-06-22 21:15:41
#include <bits/stdc++.h>
using namespace std;
using i64 = int64_t;
int n, m, sz[200200];
i64 ans;
vector<int> vc[200200];
const int mod = 1e9 + 7;
void dfs1(int u, int pa){
sz[u] = (u <= n);
for(auto v:vc[u]){
if(v == pa) continue;
dfs1(v, u);
sz[u] += sz[v];
}
}
void dfs2(int u, int pa){
if(u > n){
vector<i64> pref(5, 0), a;
pref[0] = 1ll;
for(auto v:vc[u]){
if(sz[v] > sz[u]) a.push_back((i64)(n - sz[u]));
else a.push_back((i64)sz[v]);
}
for(auto x:a) for(int i = 4; i >= 1; --i) pref[i] = (pref[i] + pref[i - 1]*x)%mod;
ans = (ans + pref[4])%mod;
}
for(auto v:vc[u]){
if(v == pa) continue;
dfs2(v, u);
}
}
int main(){
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n >> m;
for(int i = 0; i < n + m - 1; ++i){
int u, v; cin >> u >> v;
vc[u].push_back(v);
vc[v].push_back(u);
}
dfs1(1, -1);
dfs2(1, -1);
cout << ans << '\n';
}