Submission
Status:
(PPTSSSSSSS)(-SSSSSSSSSSS)(P-SSSSS)(-SSS)(-SSSSSS)(TSSSSSS)
Subtask/Task Score:
{0/4}{0/14}{0/12}{0/7}{0/20}{0/43}
Score: 0
User: koon
Problemset: อพยพปลอดภัย (Quartet)
Language: cpp
Time: 1.095 second
Submitted On: 2026-04-23 20:27:04
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9+7;
int n, m;
bool c_h(int u) {
return u <= n;
}
struct node {
int a, b;
int sum() {
return a + b;
}
};
vector<node> cnt;
vector<vector<int>> adj;
vector<int> subtree;
int dfs(int u, int p) {
int res = cnt[u].a;
for (auto &v : adj[u]) {
if (v == p) continue;
res += dfs(v, u);
}
return subtree[u] = res;
}
int main() {
cin.tie(0)->sync_with_stdio(false);
cin >> n >> m;
cnt.resize(m, {0, 0});
adj.resize(m);
subtree.resize(m);
for (int i = 0; i < n + m - 1; i++) {
int a, b;
cin >> a >> b;
if (!c_h(a) && c_h(b)) {
cnt[a-n-1].a++;
}
else if (!c_h(b) && c_h(a)) {
cnt[b-n-1].a++;
}
else {
cnt[a-n-1].b++;
cnt[b-n-1].b++;
adj[a-n-1].push_back(b-n-1);
adj[b-n-1].push_back(a-n-1);
}
}
for (int i = 0; i < m; i++) {
dfs(i, -1);
}
long long sum = 0;
for (int i = 0; i < m; i++) {
if (cnt[i].sum() >= 4) {
vector<long long> res;
for (int j = 0; j < cnt[i].a; j++) {
res.push_back(1);
}
for (auto &x : adj[i]) {
res.push_back(subtree[x]);
}
int k = res.size();
long long temp = 0;
for (int a = 0; a < k; a++) {
for (int b = a+1; b < k; b++) {
for (int c = b+1; c < k; c++) {
for (int d = c+1; d < k; d++) {
long long t = res[a];
t = (t * res[b]) % MOD;
t = (t * res[c]) % MOD;
t = (t * res[d]) % MOD;
temp = (temp + t) % MOD;
}
}
}
}
sum = (sum + temp) % MOD;
}
}
cout << sum;
return 0;
}