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: mydKN
Problemset: อพยพปลอดภัย (Quartet)
Language: cpp
Time: 0.064 second
Submitted On: 2025-06-25 15:01:33
#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
#define ll long long
const ll maxn = 2e5 + 5;
const ll mod = 1e9 + 7;
ll n, m;
vector<ll> adj[maxn];
ll sub[maxn];
ll res;
ll arr[maxn];
ll dfs(ll u, ll p){
if(u <= n) ++sub[u];
for(auto v : adj[u]){
if(v == p) continue;
sub[u] += dfs(v, u);
}
return sub[u];
}
ll dfs2(ll u, ll p){
ll 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(ll i=0;i<cnt;++i){
for(ll 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(ll i=0;i<n+m-1;++i){
ll 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
*/