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: exoworldgd
Problemset: อพยพปลอดภัย (Quartet)
Language: cpp
Time: 0.056 second
Submitted On: 2025-11-09 00:16:11
#pragma GCC optimize("O5,unroll-loops,inline")
#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
#include <bits/stdc++.h>
#define exoworldgd cin.tie(0)->sync_with_stdio(0), cout.tie(0)
#define int long long
using namespace std;
const int inf = LLONG_MAX, mod = 1e9+7, maxn = 2e5+5;
int deg[maxn],dp[5][maxn],sub[maxn];
vector<int> adj[maxn];
void dfs(int u, int p) {
sub[u] = (u <= deg[0]) ? 1 : 0;
for (int v : adj[u]) if (v^p) dfs(v,u), sub[u] += sub[v];
}
signed main(void) {
exoworldgd;
int n,m,x,y,ans=0;
cin >> n >> m, deg[0]=n;
for (int i = 0; i < n+m-1; i++) cin >> x >> y, adj[x].push_back(y), adj[y].push_back(x), deg[x]++, deg[y]++;
dfs(n+1,-1);
for (int i = n+1; i <= n+m; i++) {
if (deg[i] < 4) continue;
vector<int> v;
for (int u : adj[i]) v.push_back(sub[u] < sub[i] ? sub[u] : sub[n+1] - sub[i]);
int sz = v.size();
if (sz < 4) continue;
for (int k = 0; k < 5; k++) for (int j = 0; j <= sz; j++) dp[k][j] = 0;
for (int j = 0; j <= sz; j++) dp[0][j] = 1;
for (int j = sz-1; j >= 0; j--) for (int k = 1; k <= 4 && k <= sz-j; k++) dp[k][j] = dp[k][j+1], k == 1 ? dp[k][j] = (dp[k][j]+v[j])%mod : dp[k][j] = (dp[k][j]+(v[j]*dp[k-1][j+1])%mod)%mod;
ans = (ans+dp[4][0])%mod;
}
cout << ans;
}