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: njoop

Problemset: อพยพปลอดภัย (Quartet)

Language: cpp

Time: 0.071 second

Submitted On: 2025-05-23 18:01:58

#include <bits/stdc++.h>
#define pb push_back
#define pii pair<int,int>
#define f first
#define s second
#define MAXN 200005
#define MOD (int)(1e9+7)
#define INF (int)1e17
#define enl '\n'
#define int long long
#define DB(code) cout<<'\t'<<code<<'\n';
#define SP <<' '<<
using namespace std;
int n,m,ans;
vector<int> tree[MAXN];
int cnt[MAXN],up[MAXN];
void dfs_cnt(int cur,int prv){
    if(cur<n) cnt[cur]++;
    for(auto v: tree[cur]) if(v!=prv){
        dfs_cnt(v,cur);
        cnt[cur]+=cnt[v];
    }
}
void dfs_calc(int cur,int prv){
    if(cur>=n){
        vector<int> num;
        num.pb(up[cur]);
        for(auto v: tree[cur]) if(v!=prv) num.pb(cnt[v]);
        int x=num.size();
        int dp[5][x+1];
        for(int i=0; i<=x; i++) dp[0][i]=1;
        for(int j=1; j<=4; j++) dp[j][0]=0;
        for(int j=1; j<=4; j++) for(int i=1; i<=x; i++) dp[j][i]=(dp[j-1][i-1]*num[i-1]%MOD+dp[j][i-1])%MOD;
        ans=(ans+dp[4][x])%MOD;
    }
    for(auto v: tree[cur]) if(v!=prv){
        up[v]=up[cur]+cnt[cur]-cnt[v];
        dfs_calc(v,cur);
    }
}
signed main(){
    cin.tie(0)->sync_with_stdio(false);
    int u,v;
    cin >> n >> m;
    for(int i=1; i<n+m; i++){
        cin >> u >> v;
        u--; v--;
        tree[u].pb(v);
        tree[v].pb(u);
    }
    dfs_cnt(0,0);
    dfs_calc(0,0);
    cout << ans;
    return 0;
}

/*

6 2
1 7
2 7
7 3
3 8
8 4
8 5
8 6

6 1
7 1
7 2
7 3
7 4
7 5
7 6

*/