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

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

Language: cpp

Time: 0.093 second

Submitted On: 2026-04-24 23:57:01

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e9+7;
const int N = 2e5+5;

vector<int> graph[N];
vector<int> edge[N];
int val[N];
int n, m;

void dfs(int u, int p) {
    if (u <= n) val[u] = 1;
    for (int v : graph[u]) {
        if (v == p) continue;
        dfs(v, u);
        val[u] += val[v];
        edge[u].emplace_back(val[v]);
    }
}

void set_val(int u, int p) {
    if (u <= n) return;
    for (int v : graph[u]) {
        if (v == p || v <= n) continue;
        edge[v].emplace_back(n-val[v]);
        set_val(v, u);
    }
}

signed main() {
    ios_base::sync_with_stdio(false); cin.tie(nullptr);
    cin >> n >> m;
    for (int i = 1; i < n+m; ++i) {
        int u, v; cin >> u >> v;
        graph[u].emplace_back(v);
        graph[v].emplace_back(u);
    }

    dfs(n+1, n+1);
    set_val(n+1, n+1);

    // for (int i : edge[n+1]) {
    //     cout << i << " ";
    // }
    // cout << '\n';

    int ans = 0;
    for (int i = n+1; i <= n+m; ++i) {
        // cout << "I : " << i << " | ";
        // for (int j : edge[i]) cout << j << " ";
        // cout << '\n';
        if (edge[i].size() < 4) continue;
        int dp[5] = {0};
        for (int val : edge[i]) {
            dp[4] += dp[3]*val;
            dp[3] += dp[2]*val;
            dp[2] += dp[1]*val;
            dp[1] += val;
        }
        ans += dp[4] % mod;
    }
    cout << ans % mod;

    return 0;
}