제출 #1257767

#제출 시각아이디문제언어결과실행 시간메모리
1257767pastaSubtree (INOI20_subtree)C++20
100 / 100
83 ms36680 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; typedef long long ll; #define pb push_back #define F first #define S second #define all(x) x.begin(), x.end() const int maxn = 1e5 + 10; const int mod = 1e9 + 7; ll pw(ll a, ll b) { ll ret = 1; while (b) { if (b & 1) { (ret *= a) %= mod; } b /= 2; (a *= a) %= mod; } return ret; } void relax(ll &x) { while (x < 0) x += mod; while (x >= mod) x -= mod; } int n, m, par[maxn], h[maxn]; ll dp[maxn]; vector<int> G[maxn]; bool mark[maxn]; void dfs(int v) { mark[v] = 1; dp[v] = 1; vector<int> bck; for (int u : G[v]) { if (!mark[u]) { par[u] = v; h[u] = h[v] + 1; dfs(u); dp[v] = (dp[v] * (dp[u] + 1)) % mod; } else if (u != par[v] && h[u] > h[v]) { bck.pb(u); } } for (int u : bck) { // bck <= 1 vector<ll> f; int lst = n; while (u != par[v]) { f.pb(dp[u] * pw((dp[lst] + 1), mod - 2) % mod); lst = u; u = par[u]; } dp[v] = 0; vector<ll> suf, prf, sum; reverse(all(f)); prf.pb(f[0]); for (int i = 1; i < f.size(); i++) { prf.pb(prf.back() * f[i] % mod); } sum.pb(f[0]); for (int i = 1; i < f.size(); i++) { sum.pb((sum.back() + prf[i]) % mod); } suf.pb(1); for (int i = f.size() - 1; i >= 1; i--) { suf.pb(suf.back() * f[i] % mod); } reverse(all(suf)); for (int i = 1; i < f.size(); i++) { dp[v] += (suf[i] * sum[i - 1]) % mod; relax(dp[v]); } } } signed main() { cin >> n >> m; for (int i = 1; i <= m; i++) { int v, u; cin >> v >> u; v--; u--; G[v].pb(u); G[u].pb(v); } par[0] = -1; dfs(0); ll ans = 0; for (int i = 0; i < n; i++) { ans += dp[i]; relax(ans); } cout << ans << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...