传送门

首先,所有连通块的个数的期望再减去每个点孤立的概率就是答案。

设 \(d_i\) 表示 \(i\) 的度数,那么每个点孤立的概率为 \(\frac{1}{2^{d_i}}\)

考虑计算所有连通块的个数的期望

对于一棵树来说,每次删除一条边会使得连通块的个数 \(+1\),概率为 \(\frac{1}{2}\),那么 \(n-1\) 条边的期望就是 \(1+\frac{n-1}{2}\)

对于仙人掌来说,如果这次删的是环上第一个被删除的边,那么不会贡献答案,所以要减去在一个环上至少删除了一条边的概率,设长度为 \(len\),就要减去 \(1-\frac{1}{2^{len}}\)

所以只要求出每个环就好了。

# include <bits/stdc++.h>
using namespace std;
typedef long long ll; namespace IO {
const int maxn(1 << 21 | 1); char ibuf[maxn], *iS, *iT, c;
int f; inline char Getc() {
return (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, maxn, stdin), (iS == iT ? EOF : *iS++)) : *iS++);
} template <class Int> inline void In(Int &x) {
for (f = 1, c = Getc(); c < '0' || c > '9'; c = Getc()) f = c == '-' ? -1 : 1;
for (x = 0; c <= '9' && c >= '0'; c = Getc()) x = (x << 3) + (x << 1) + (c ^ 48);
x *= f;
}
} using IO :: In; const int maxn(1e6 + 5);
const int mod(1e9 + 7); inline void Inc(int &x, const int y) {
x = x + y >= mod ? x + y - mod : x + y;
} inline void Dec(int &x, const int y) {
x = x - y < 0 ? x - y + mod : x - y;
} inline int Add(int x, const int y) {
return x + y >= mod ? x + y - mod : x + y;
} inline int Sub(int x, const int y) {
return x - y < 0 ? x - y + mod : x - y;
} inline int Pow(ll x, int y) {
ll ret = 1;
for (; y; y >>= 1, x = x * x % mod)
if (y & 1) ret = ret * x % mod;
return ret;
} struct Edge { int to, next; }; int n, m, d[maxn], first[maxn], cnt, inv2[maxn << 1], fa[maxn], ans, vis[maxn], deep[maxn];
Edge edge[maxn << 2]; inline void AddEdge(int u, int v) {
edge[cnt] = (Edge){v, first[u]}, first[u] = cnt++, ++d[u];
edge[cnt] = (Edge){u, first[v]}, first[v] = cnt++, ++d[v];
} void Dfs(int u, int ff) {
int e, v, len, cur;
vis[u] = 1;
for (e = first[u]; ~e; e = edge[e].next)
if ((v = edge[e].to) ^ ff) {
if (!vis[v]) deep[v] = deep[u] + 1, fa[v] = u, Dfs(v, u);
else if (deep[v] < deep[u]) {
for (len = 1, cur = u; cur ^ v; cur = fa[cur]) ++len;
Dec(ans, (ll)Sub(1, inv2[len]) % mod);
}
}
} int main() {
int i, u, v;
memset(first, -1, sizeof(first));
In(n), In(m);
inv2[0] = 1, inv2[1] = (mod + 1) >> 1;
for (v = m + m, i = 2; i <= v; ++i) inv2[i] = (ll)inv2[i - 1] * inv2[1] % mod;
for (i = 1; i <= m; ++i) In(u), In(v), AddEdge(u, v);
ans = Add(1, (ll)m * inv2[1] % mod), Dfs(1, 0);
for (i = 1; i <= n; ++i) Dec(ans, inv2[d[i]]);
ans = (ll)ans * Pow(2, m) % mod, printf("%d\n", ans);
return 0;
}

BZOJ5473: 仙人掌的更多相关文章

  1. bzoj1023: [SHOI2008]cactus仙人掌图

    学习了一下圆方树. 圆方树是一种可以处理仙人掌的数据结构,具体见这里:http://immortalco.blog.uoj.ac/blog/1955 简单来讲它是这么做的:用tarjan找环,然后对每 ...

  2. 【BZOJ 1023】【SHOI 2008】cactus仙人掌图

    良心的题解↓ http://z55250825.blog.163.com/blog/static/150230809201412793151890/ tarjan的时候如果是树边则做树形DP(遇到环就 ...

  3. 【BZOJ-1952】城市规划 [坑题] 仙人掌DP + 最大点权独立集(改)

    1952: [Sdoi2010]城市规划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 73  Solved: 23[Submit][Status][ ...

  4. 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集

    4316: 小C的独立集 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 57  Solved: 41[Submit][Status][Discuss] ...

  5. 仙人掌(cactus)

    仙人掌(cactus) Time Limit:1000ms Memory Limit:64MB 题目描述 LYK 在冲刺清华集训(THUSC) !于是它开始研究仙人掌,它想来和你一起分享它最近研究的 ...

  6. 【bzoj1023】仙人掌图

    [bzoj1023]仙人掌图 题意 给一棵仙人掌,求直径. \(n\leq 100000\) 分析 分析1:[Tarjan]+[环处理+单调队列优化线性dp]+[树形dp] 分开两种情况处理: ①环: ...

  7. hdu3594 强连通(仙人掌图)

    题意:给定一张有向图,问是否是仙人掌图.仙人掌图的定义是,首先,这张图是一个强连通分量,其次所有边在且仅在一个环内. 首先,tarjan可以判强连通分量是否只有一个.然后对于所有边是否仅在一个环内,我 ...

  8. 【BZOJ】【1023】【SHOI2008】cactus仙人掌图

    DP+单调队列/仙人掌 题解:http://hzwer.com/4645.html->http://z55250825.blog.163.com/blog/static/150230809201 ...

  9. bzoj 1023: [SHOI2008]cactus仙人掌图

    这道题是我做的第一道仙人掌DP,小小纪念一下…… 仙人掌DP就是环上的点环状DP,树上的点树上DP.就是说,做一遍DFS,DFS的过程中处理出环,环上的点先不DP,先把这些换上的点的后继点都处理出来, ...

随机推荐

  1. Swift5 语言指南(二十八) 高级运算符

    除了Basic Operators中描述的运算符之外,Swift还提供了几个执行更复杂值操作的高级运算符.这些包括C和Objective-C中您熟悉的所有按位和位移运算符. 与C中的算术运算符不同,S ...

  2. css 图片文字居中

    1.单行文字居中 2.多行文字居中 3.利用background-position:center;的图片居中 4.利用display:table-cell;属性的图片居中 <!DOCTYPE h ...

  3. 【xsy2504】farm 容斥原理

    题目大意:给你三个数$n,m,s$,满足$n,m,s≤10^{18}$且最大质因数均不大于$10^6$. 问你存在多少个整数$k$,满足$0≤k≤m$,且$(k,0)$,$(0,n)$,$(x,y)$ ...

  4. vue教程1-03 v-for循环

    vue教程1-03 v-for循环 v-for循环: v-for="name in arr" {{value}} {{$index}} v-for="name in js ...

  5. Python动态变量名定义与调用

    动态变量名赋值 在使用tkinter时需要动态生成变量,如动态生成var1...var10变量 使用exec动态赋值 exec在python3中是内置函数,它支持python代码的动态执行. 示例: ...

  6. 【从0到1学Web前端】CSS定位问题一(盒模型,浮动,BFC) 分类: HTML+CSS 2015-05-27 22:24 813人阅读 评论(1) 收藏

    引子: 在谈到css定位问题的时候先来看一个小问题: 已知宽度(假如:100px)div框,水平居中,左右两百年的分别使用div框填充.且左右div自适应. 效果如下图: 这个问题的难点主要是浏览器宽 ...

  7. ASP.NET WebAPI Bearer Authorization

    使用VS2015新建一个WebApi项目. 关键的配置在Startup.Auth.cs里 public partial class Startup { public static OAuthAutho ...

  8. 02-02:springboot 整合filter

    1.通过注解扫描完成Filter组件的注册 1.1编写filter (添加拦截的servlet) //@WebFilter(filterName = "FirstFilter",u ...

  9. 读书笔记(01) - JSON - JavaScript高级程序设计

    JSON与JavaScript对象 JSON是一种表示结构化数据的存储格式,语法格式上与JavasScript对象有些类似. TIPS: 与JavaScript对象的格式区别 不支持变量.函数或对象实 ...

  10. 解决 Error: ENOSPC: System limit for number of file watchers reached

    manjaro 18.0 kde版本 运行 yarn test报错 Error: ENOSPC: System limit for number of file watchers reached 解决 ...