제출 #579078

#제출 시각아이디문제언어결과실행 시간메모리
579078piOOEStar Trek (CEOI20_startrek)C++17
45 / 100
67 ms19464 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 100000, mod = 1e9 + 7; int add(int a, int b) { return a + b < mod ? a + b : a + b - mod; } int mul(int a, int b) { return a * (ll) b % mod; } int binp(int a, ll p) { int ans = 1; for (; p > 0; p >>= 1, a = mul(a, a)) { if (p & 1) { ans = mul(ans, a); } } return ans; } int sub(int a, int b) { return a >= b ? a - b : a - b + mod; } int inv(int a) { return binp(a, mod - 2); } vector<int> g[N]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; ll d; cin >> n >> d; for (int i = 1; i < n; ++i) { int a, b; cin >> a >> b; --a, --b; g[a].push_back(b); g[b].push_back(a); } vector<bool> dp(n); vector<int> cntLoosing(n), c(n), gg(n); function<void(int, int)> dfs1 = [&](int v, int p) { dp[v] = false; cntLoosing[v] = 0; int total = 0, only_loosing = 0; for (int to: g[v]) { if (to != p) { dfs1(to, v); if (!dp[to]) { only_loosing += c[to]; ++cntLoosing[v]; dp[v] = true; } total += c[to]; } } if (cntLoosing[v] > 1) { c[v] = 0; } else if (cntLoosing[v] == 1) { c[v] = only_loosing; } else { c[v] = total + 1; } }; function<void(int, int)> dfs2 = [&](int v, int p) { int total = 0; for (int to: g[v]) { total += gg[to]; } dp[v] = cntLoosing[v]; for (int to: g[v]) { if (to != p) { int new_gg = total; if (cntLoosing[v] == 1 && !dp[to]) { new_gg = 0; } else if (cntLoosing[v] == 0) { new_gg -= c[to]; } bool new_dp = dp[v]; if (!dp[to] && cntLoosing[v] == 1) { new_dp = false; } cntLoosing[to] += !new_dp; if (cntLoosing[to] > 1) { c[to] = 0; } else if (cntLoosing[to] == 1) { if (!new_dp) { c[to] = new_gg + 1; } } else { c[to] = new_gg + c[to]; } dfs2(to, v); } } }; dfs1(0, -1); gg = c; dfs2(0, -1); int E = 0, L = 0; for (int i = 0; i < n; ++i) { if (dp[i]) { E = add(E, c[i]); } else { L += 1; E = sub(E, c[i]); } // cout << dp[i] << " "; } // cout << endl; int a = mul(n, n); int x = mul(L, mul(sub(binp(a, d), binp(E, d)), inv(sub(a, E)))); int ans; if (dp[0]) { ans = mul(x, c[0]); } else { ans = sub(binp(a, d), mul(x, c[0])); } cout << sub(binp(a, d), ans); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...