제출 #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...