#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |