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

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

Language: cpp

Time: 0.055 second

Submitted On: 2026-04-10 17:43:39

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

int n, m;
vector<int> adj[N];
ll dp[5][N];
void dfs(int u, int p){
    dp[0][u] = 1;
    if(u <= n){
        dp[1][u] = 1;
        return;
    }
    int sum = 0;
    for(int v : adj[u]){
        if(v == p) continue;
        dfs(v, u);
        sum += dp[1][v];
    }
    for(int v : adj[u]){
        if(v == p) continue;
        for(int i = 4; i > 0; --i){
            dp[i][u] += (dp[i-1][u]*dp[1][v])%mod;
            dp[i][u] %= mod;
        }
    }
}
int 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;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    dfs(n+1, 0);
    ll ans = 0;
    for(int i = n+1; i <= n+m; ++i){
        if(i != n+1){
            for(int j = 4; j > 0; --j){
                dp[j][i] += (dp[j-1][i]*(n-dp[1][i]))%mod;
                dp[j][i] %= mod;
            }
        }
        ans = (ans+dp[4][i])%mod;
    }
    cout << ans << '\n';
}