Submission
Status:
(PP-SSSSSSS)(P-SSSSSSSSSS)(PPPP-SS)(-SSS)(PP-SSSS)(-SSSSSS)
Subtask/Task Score:
{0/4}{0/14}{0/12}{0/7}{0/20}{0/43}
Score: 0
User: erng
Problemset: อพยพปลอดภัย (Quartet)
Language: cpp
Time: 0.006 second
Submitted On: 2026-03-19 18:15:23
#include <bits/stdc++.h>
using namespace std;
const int nx=1e5+5, mod=1e9+7;
int n, m, sz[nx], ans;
vector<int> adj[nx], cnt[nx];
void dfs(int u, int p)
{
sz[u]=(u<=n);
for (auto v : adj[u])
{
if (v==p) continue;
dfs(v, u);
if (sz[v]>0) cnt[u].push_back(sz[v]), sz[u]+=sz[v];
}
cnt[u].push_back(n-sz[u]);
}
int main()
{
cin.tie(NULL)->sync_with_stdio(false);
cin>>n>>m;
for (int i=1;i<n+m; i++)
{
int u, v;
cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
dfs(1,1);
for (int u=n+1; u<=n+m; u++)
{
int siz=cnt[u].size();
if (siz>=4)
{
int dp[siz+1][5];
for (int i=0; i<=siz; i++)
{
for (int j=0; j<5; j++)
{
dp[i][j]=0;
}
}
dp[0][0]=1;
for (int i=1; i<=siz; i++)
{
dp[i][0]=1;
for (int j=1; j<=4; j++)
{
dp[i][j]=dp[i-1][j]+(dp[i-1][j-1]*cnt[u][i-1]);
}
}
ans+=dp[siz][4];
ans%=mod;
}
}
cout<<ans;
}