Submission
Status:
(PPPPPPPP-S)(PP-SSSSSSSSS)(PPPP-SS)(-SSS)(PP-SSSS)(-SSSSSS)
Subtask/Task Score:
{0/4}{0/14}{0/12}{0/7}{0/20}{0/43}
Score: 0
User: mydKN
Problemset: อพยพปลอดภัย (Quartet)
Language: cpp
Time: 0.026 second
Submitted On: 2025-06-26 10:15:20
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast", "unroll-loops")
#pragma GCC target("avx2")
using namespace std;
#define emb emplace_back
#define em emplace
#define pb push_back
const int maxn = 2e5 + 5;
const int mod = 1e9 + 7;
int n, m;
vector<int> adj[maxn];
int sub[maxn];
int res;
int arr[maxn];
int dfs(int u, int p){
if(u <= n) ++sub[u];
for(auto v : adj[u]){
if(v == p) continue;
sub[u] += dfs(v, u);
}
return sub[u];
}
int dfs2(int u, int p){
int cnt = 0, qs[5] = {};
qs[0] = 1;
if(u > n){
// cout << u << " ";
for(auto v : adj[u]){
if(v == p) arr[cnt++] = n - sub[u];
else arr[cnt++] = sub[v];
// cout << arr[cnt-1] << " ";
}
// cout << "\n";
for(int i=0;i<cnt;++i){
for(int j=4;j>0;--j){
qs[j] = (qs[j] + (qs[j-1] * arr[i]) % mod) % mod;
}
}
}
for(auto v : adj[u]){
if(v == p) continue;
qs[4] = (qs[4] + dfs2(v, u)) % mod;
}
// cout << u << " " << qs[4] << "\n";
return qs[4];
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin >> n >> m;
for(int i=0;i<n+m-1;++i){
int u, v;
cin >> u >> v;
adj[u].emb(v);
adj[v].emb(u);
}
dfs(1, -1);
// for(int i=1;i<=n+m;++i) cout << sub[i] << " ";
cout << dfs2(1, -1);
}
/*
6 3
1 7
2 7
3 7
4 8
5 9
6 9
7 8
8 9
9 4
1 10
2 10
3 10
4 10
5 11
6 11
7 12
8 13
9 13
10 12
12 11
12 13
*/