首先,我们要用到期望的一个性质:

对于两个随机变量$X$和$Y$(不需要相互独立),有$E(X+Y)=E(X)+E(Y)$

另外,对于一个仙人掌,令$n$为点数,$m$为边数,$c$为简单环个数,$X$为连通块数,则$X=n-(m-c)$(环可以看作有一条无意义的边,对于森林点-边即为连通块数)

我们所求的即$E((X-E(X))^{2})$,将其展开即$E(X^{2})-E(X)^{2}$,后者$E(X)=E(n)-E(m)+E(c)$,以下以$E(m)$为例来考虑:

令$x_{1},x_{2},...,x_{m}$表示每一条边是否被存在,即若其存在则$x_{i}=1$,否则$x_{i}=0$

显然$m=\sum_{i=1}^{m}x_{i}$,根据性质1,即$E(m)=\sum_{i=1}^{m}E(x_{i})=\frac{m}{4}$

类似地,有$E(n)=\frac{n}{2}$以及$E(c)=\sum_{环}\frac{1}{2^{环上点数}}$

对于$E(X^{2})$,将其展开即$E(X^{2})=E(n^{2})+E(m^{2})+E(c^{2})-2E(nm)+2E(nc)-2E(mc)$,以下同样以$2E(mc)$为例来考虑:

令$x_{1},x_{2},...,x_{m}$与之前相同,再定义$y_{1},y_{2},...,y_{c}$(其中$c$为环数)来表示每一个环是否存在(存在为1,不存在为0),则$E(mc)=E(\sum_{i=1}^{m}x_{i}\sum_{j=1}^{c}y_{j})$

同样利用性质1展开,也就是$\sum_{i=1}^{m}\sum_{j=1}^{c}E(x_{i}y_{j})$,不难发现$E(x_{i}y_{j})=P(第i条边和第j个环同时存在)$,后者也就是第$i$条边和第$j$个环同时覆盖了多少个点的2的幂次

简单对交点数分类讨论即可,时间复杂度可以通过预处理2幂次的逆元来做到严格线性,另外由于每一条边至多被覆盖一次,可以暴力枚举所有环上所有点

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 500005
4 #define mod 1000000007
5 struct Edge{
6 int nex,to;
7 }edge[N<<1];
8 vector<pair<int,int> >v;
9 int E,n,m,x,y,inv[N],head[N],r[N],dfn[N],f[N],dep[N],sum[N];
10 int En,Em,Ec,En2,Em2,Ec2,Enm,Enc,Emc,EX,EX2,ans;
11 void add(int x,int y){
12 edge[E].nex=head[x];
13 edge[E].to=y;
14 head[x]=E++;
15 }
16 void dfs(int k,int fa,int s){
17 dfn[k]=++dfn[0];
18 f[k]=fa;
19 dep[k]=s;
20 for(int i=head[k];i!=-1;i=edge[i].nex)
21 if (edge[i].to!=fa){
22 if (!dfn[edge[i].to])dfs(edge[i].to,k,s+1);
23 else{
24 if (dep[edge[i].to]>=s)continue;
25 int l=s-dep[edge[i].to]+1;
26 Ec=(Ec+inv[l])%mod;
27 Enc=(Enc+1LL*(n-l)*inv[l+1]+1LL*l*inv[l])%mod;
28 int s_same=l;
29 for(int j=k;;j=f[j]){
30 s_same=s_same+r[j]-2;
31 sum[j]=(sum[j]+inv[l])%mod;
32 if (j==edge[i].to)break;
33 }
34 Emc=(Emc+1LL*(m-s_same)*inv[l+2]+1LL*(s_same-l)*inv[l+1]+1LL*l*inv[l])%mod;
35 sum[0]=(sum[0]+inv[l])%mod;
36 v.push_back(make_pair(k,edge[i].to));
37 }
38 }
39 }
40 int main(){
41 inv[0]=1;
42 for(int i=1;i<N;i++)inv[i]=1LL*(mod+1)/2*inv[i-1]%mod;
43 scanf("%d%d",&n,&m);
44 memset(head,-1,sizeof(head));
45 for(int i=1;i<=m;i++){
46 scanf("%d%d",&x,&y);
47 add(x,y);
48 add(y,x);
49 r[x]++,r[y]++;
50 }
51 En=1LL*n*inv[1]%mod;
52 Em=1LL*m*inv[2]%mod;
53 En2=(1LL*n*(n-1)%mod*inv[2]+1LL*n*inv[1])%mod;
54 Enm=(1LL*m*(n-2)%mod*inv[3]+2LL*m*inv[2])%mod;
55 for(int i=1;i<=n;i++)
56 for(int j=head[i];j!=-1;j=edge[j].nex){
57 x=i,y=edge[j].to;
58 if (x<y)Em2=(Em2+1LL*(m-r[x]-r[y]+1)*inv[4]+1LL*(r[x]+r[y]-2)*inv[3]%mod+inv[2])%mod;
59 }
60 dfs(1,0,0);
61 for(int i=0;i<v.size();i++){
62 x=v[i].first,y=v[i].second;
63 int l=dep[x]-dep[y]+1,s_same=inv[l];
64 for(int j=x;;j=f[j]){
65 s_same=((s_same+sum[j]-inv[l])%mod+mod)%mod;
66 if (j==y)break;
67 }
68 Ec2=(Ec2+1LL*(sum[0]+mod-s_same)*inv[l]+1LL*(s_same+mod-inv[l])*inv[l-1]+inv[l])%mod;
69 }
70 EX=((0LL+En-Em+Ec)%mod+mod)%mod;
71 EX2=((0LL+En2+Em2+Ec2-2*Enm+2*Enc-2*Emc)%mod+mod)%mod;
72 ans=(EX2-1LL*EX*EX%mod+mod)%mod;
73 printf("%d",ans);
74 }

[cf1236F]Alice and the Cactus的更多相关文章

  1. Codeforces 1236F - Alice and the Cactus(期望+分类讨论)

    Codeforces 题面传送门 & 洛谷题面传送门 期望好题. 首先拆方差: \[\begin{aligned} &E((x-E(x))^2)\\ =&E(x^2)-2E(x ...

  2. (HDU 5558) 2015ACM/ICPC亚洲区合肥站---Alice's Classified Message(后缀数组)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5558 Problem Description Alice wants to send a classi ...

  3. 2016中国大学生程序设计竞赛 - 网络选拔赛 J. Alice and Bob

    Alice and Bob Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  4. bzoj4730: Alice和Bob又在玩游戏

    Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...

  5. Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)

    Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...

  6. 阿里前端框架Alice是个不错的选择

    BootStrap虽然用户群体广大,其整体风格尽管有不少skin可选,但以国情来看还是不好看. 阿里开源的前端框架,个人觉得还是很不错,Alice处处透着支付宝中界面风格的气息,电商感挺强. 以下内容 ...

  7. poj 1698 Alice‘s Chance

    poj 1698  Alice's Chance 题目地址: http://poj.org/problem?id=1698 题意: 演员Alice ,面对n场电影,每场电影拍摄持续w周,每周特定几天拍 ...

  8. Alice and Bob 要用到辗转相减

    Alice and BobTime Limit: 1 Sec  Memory Limit: 64 MBSubmit: 255  Solved: 43 Description Alice is a be ...

  9. Codeforces Round #143 (Div. 2) E. Cactus 无向图缩环+LCA

    E. Cactus   A connected undirected graph is called a vertex cactus, if each vertex of this graph bel ...

随机推荐

  1. 活动回顾|ShardingSphere X openGauss,将会产生怎样的化学反应?

    "ShardingSphere 作为 openGauss 生态的开源分布式数据库解决方案,将持续助力于 openGauss,满足千行百业广大客户分布式场景需求." 5月29日,由  ...

  2. js Promise用法

    Promise 英文意思是 承诺的意思,是对将来的事情做了承诺, Promise 有三种状态, Pending 进行中或者等待中 Fulfilled 已成功 Rejected 已失败 Promise ...

  3. js--typeof 和 instanceof 判断数据类型的区别及开发中的使用

    前言 日常的开发中,我们经常会遇到判断一个变量的数据类型或者该变量是否为空值的情况,你是如何去选择判断类型的操作符的?本文来总结记录一下我们开发人员必须掌握的关于 typeof 和 instanceo ...

  4. 初学python-day3 列表

  5. PHP伪协议与文件包含漏洞1

    PHP文件包含漏洞花样繁多,需配合代码审计. 看能否使用这类漏洞时,主要看: (1)代码中是否有include(),且参数可控: 如: (2)php.ini设置:确保 allow_url_fopen= ...

  6. UltraSoft - Beta - Scrum Meeting 9

    Date: May 25th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 记录Scrum Meeting Liuzh 前端 用户忘记密码界面初稿完成 Kkk ...

  7. 使用flink实现一个简单的wordcount

    使用flink实现一个简单的wordcount 一.背景 二.需求 三.前置条件 1.jdk版本要求 2.maven版本要求 四.实现步骤 1.创建 flink 项目 2.编写程序步骤 1.创建Str ...

  8. Redis核心原理与实践--Redis启动过程源码分析

    Redis服务器负责接收处理用户请求,为用户提供服务. Redis服务器的启动命令格式如下: redis-server [ configfile ] [ options ] configfile参数指 ...

  9. 洛谷 P2680 [NOIP2015 提高组] 运输计划

    链接:P2680 题意: 在树上把一条边边权变为0使得最长给定路径最短 分析: 最大值最小可以想到二分答案,对于每一个mid,寻找所有大于mid的路径,再寻找是否存在一条边使得删去它后大于mid的路径 ...

  10. Notepad++ 过滤注释行和空行

    Notepad++ 删除指定字符开头的行的正则表达式 1.删除A之后的所有字符用:A.*$ 2.删除A之前的所有字符用:^([^s]*)A ####如果是其他字符就把A替换为其他字符 注释:如何是特殊 ...