题目大意

  给你一个\(n\)个点\(m\)条边的无向图(可能有重边),对于这个图的边集的子集(一共有\(2^m\)个),如果其导出的子图的每个联通块内都存在欧拉回路,我们就把答案加上这个子图的边数的平方,答案对\({10}^9+7\)取模。

  \(n,m\leq 200000\)

题解

  先求出这个图的DFS树。

  记\(c\)为这个图的联通块个数。

  通过观察发现,如果非树边任意选,那么确定非树边之后树边只有一种选择方案(从下往上做一遍树形DP可以得到方案)。

  所以选择方案是\(2^{m-n+c}\)种。

  但是这题要求的是边数的平方和。

  假设当前删除了\(x\)条边,那么边数平方就是\({(m-x)}^2=m^2-2mx+x^2\)。

  现在要求出删除一条边/两条边后的方案数(就是联通块个数)。

  第一项很好计算,就是方案数\(\times m^2\)。

  第二项很好计算,如果一条边是桥,那么\(c++\),否则不变。

  第三项不那么好计算。如果两条边都是桥,那么\(c+=2\)。如果一条边是桥但另一条边不是,那么\(c++\)。否则(两条边不是桥),有可能是\(c++\),有可能\(c\)不变。

  那么什么时候\(c\)会\(+1\)呢?可以用DZY Loves Chinese II这道题的方法,给每条非树边赋一个随机权值,每条树边的权值就是跨过这条树边的其他非树边的权值的异或和。

  这样,删除两条非桥边会产生新的联通块当且仅当着两条边的权值相同。

  那错误概率又是多少呢?

  考虑这两条边的异或和是由哪些边组成的。异或和为\(0\)当且仅当每一位为\(0\)。每一位为\(0\)当且仅当这些边的这一位有偶数个\(1\),这个概率是\(\frac 12\)。那么\(64\)位全部错误的概率是\(2^{-64}\),正确的概率是\(1-2^{-64}\)。

  然后直接把这些边按权值排序,每种权值统计一下就做完了。

  时间复杂度:\(O(n+m)\)

  什么?你说排序?有一种东西叫挑战排序,这种排序是\(O(m)\)的。(我没写)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long ll;
const ll p=1000000007;
ll pw[200010];
struct graph
{
int v[400010];
int w[400010];
int t[400010];
int h[200010];
int n;
int b[400010];
void add(int x,int y,int z)
{
n++;
v[n]=y;
w[n]=z;
t[n]=h[x];
h[x]=n;
}
};
graph g;
int f[200010];
ll v[200010];
int b[200010];
int d[200010];
int lx[200010];
int ly[200010];
ll c[200010];
int shu[200010];
void dfs(int x,int fa,int dep)
{
f[x]=fa;
d[x]=dep;
b[x]=1;
int i;
for(i=g.h[x];i;i=g.t[i])
if(!b[g.v[i]])
{
dfs(g.v[i],x,dep+1);
shu[g.w[i]]=1;
g.b[i]=1;
}
}
void dfs(int x)
{
int i;
for(i=g.h[x];i;i=g.t[i])
if(g.b[i])
{
dfs(g.v[i]);
c[g.w[i]]=v[g.v[i]];
v[x]^=v[g.v[i]];
}
}
int n,m;
ll a[200010];
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
srand(time(0));
scanf("%d%d",&n,&m);
int i,x,y;
pw[0]=1;
for(i=1;i<=m;i++)
pw[i]=pw[i-1]*2%p;
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
g.add(x,y,i);
g.add(y,x,i);
lx[i]=x;
ly[i]=y;
}
int cnt=0;
ll ans;
for(i=1;i<=n;i++)
if(!b[i])
{
dfs(i,0,1);
cnt++;
}
for(i=1;i<=m;i++)
if(!shu[i])
{
ll val=(ll)rand()*RAND_MAX+rand();
v[lx[i]]^=val;
v[ly[i]]^=val;
c[i]=val;
}
for(i=1;i<=n;i++)
if(!f[i])
dfs(i);
ans=(ll)m*m%p*pw[m-n+cnt]%p;
ll s=0;
int bcnt=0;
int t=0;
for(i=1;i<=m;i++)
if(c[i])
{
s=(s+pw[m-n+cnt-1])%p;
a[++t]=c[i];
}
else
{
s=(s+pw[m-n+cnt])%p;
bcnt++;
}
sort(a+1,a+t+1);
ans=(ans-2*m*s)%p;
ans=(ans+pw[m-n+cnt]*((ll)bcnt*bcnt%p))%p;
ans=(ans+pw[m-n+cnt-1]*2%p*bcnt%p*t)%p;
s=0;
int tot=0;
for(i=1;i<=t;i++)
if(i==1||a[i]!=a[i-1])
{
s=(s+(ll)tot*tot)%p;
tot=1;
}
else
tot++;
s=(s+(ll)tot*tot)%p;
ans=(ans+pw[m-n+cnt-1]*s)%p;
if(m-n+cnt>=2)
ans=(ans+pw[m-n+cnt-2]*(((ll)t*t-s)%p))%p;
ans=(ans+p)%p;
printf("%lld\n",ans);
return 0;
}

【XSY2729】欧拉子图 无向图连通性 数学的更多相关文章

  1. 洛谷 P4708 画画(无标号欧拉子图计数)

    首先还是类似于无标号无向图计数那样,考虑点的置换带动边的置换,一定构成单射,根据 Burnside 引理: \[|X / G| = \frac{1}{|G|}\sum\limits_{g \in G} ...

  2. SGU101 求有重边的无向图欧拉迹

    题意:好多木棒,俩端有数字(0--6)标记,按数字相同的端首尾相连成一条直线(木棒可以相同).即求有重边的无向图欧拉迹. 先判定是否为欧拉图,俩个条件,不说了.如果是欧拉图,输出路经. 方法:dfs遍 ...

  3. POJ--1300--Door Man【推断无向图欧拉通路】

    链接:http://poj.org/problem?id=1300 题意:有n个房间.每一个房间有若干个门和别的房间相连.管家从m房间開始走.要回到自己的住处(0),问是否有一条路能够走遍全部的门而且 ...

  4. 【BZOJ4173】数学 欧拉函数神题

    [BZOJ4173]数学 Description Input 输入文件的第一行输入两个正整数 . Output 如题 Sample Input 5 6 Sample Output 240 HINT N ...

  5. UVaLive 7362 Farey (数学,欧拉函数)

    题意:给定一个数 n,问你0<= a <=n, 0 <= b <= n,有多少个不同的最简分数. 析:这是一个欧拉函数题,由于当时背不过模板,又不让看书,我就暴力了一下,竟然A ...

  6. 数学之欧拉函数 &几道poj欧拉题

    欧拉函数总结+证明 欧拉函数总结2 POJ 1284 原根 #include<iostream> #include<cstdio> #include<cstring> ...

  7. NOIP模拟:切蛋糕(数学欧拉函数)

    题目描述  BG 有一块细长的蛋糕,长度为 n. 有一些人要来 BG 家里吃蛋糕, BG 把蛋糕切成了若干块(整数长度),然后分给这些人. 为了公平,每个人得到的蛋糕长度和必须相等,且必须是连续的一段 ...

  8. UVA 11426 - GCD - Extreme (II) 欧拉函数-数学

    Given the value of N, you will have to find the value of G. The definition of G is given below:G =i< ...

  9. [数学][欧拉降幂定理]Exponial

    Exponial 题目 http://exam.upc.edu.cn/problem.php?cid=1512&pid=4 欧拉降幂定理:当b>phi(p)时,有a^b%p = a^(b ...

随机推荐

  1. 第四次oo博客

    论述测试与正确性论证的效果差异 单元测试利用测试者构造的测试用例来检查类或方法的正确性,一般来说所需要测试的用例是无穷多的,通过人为构造代表性的测试用例来尽量测试所有代码.测试的优点在于不易出错,只要 ...

  2. Entity Framework Core系列之什么是Entity Framework Core

    前言 Entity Framework Core (EF Core)是微软推荐的基于.NET Core framework的应用程序数据访问技术.它是轻量级,可扩展并且支持跨平台开发.EF Core是 ...

  3. koa-router

    为了处理URL,我们需要引入koa-router这个middleware,让它负责处理URL映射. 我们把上一节的hello-koa工程复制一份,重命名为url-koa. 先在package.json ...

  4. rabbitmq集群运维一点总结

    说明:以下操作都以三节点集群为例,机器名标记为机器A.机器B.机器C,如果为双节点忽略机器C,如果为各多节点则与机器C操作相同 一.rabbitmq集群必要条件 1.1.绑定实体ip,即ip a所能查 ...

  5. p86商空间也是Banach空间

    1.为什么要引入Zk? 2.为什么这个等式成立,和为什么要引入uk? 3.为什么为什么等于0? 属于M,则商空间是0元,p128最上面的第二个笔记

  6. openstack-KVM管理工具

    一. virsh 通过libvirt API管理Hpervisor.node.domain,实现多数功能调用. 即统一管理多台计算机上的域. 1.管理其他服务器(node) (1)修改配置文件:vim ...

  7. 现代程序设计 homework-06

    写代码爽还是读代码爽? 当然是写代码爽好吧... 读代码明显是读+写两倍的工作量好么... 本次作业要求: 1) 把程序编译通过, 跑起来. 读懂程序,在你觉得比较难懂的地方加上一些注释,这样大家就能 ...

  8. Golang的面向对象实践method

    最近在系统的学习go的语法,一切都弄好了之后准备弄个im项目出来玩.在这个过程中会把看到有趣的写法和语法啥的拿出来分析一下. 我一直以为go语言对面向对象没有支持,但是后面看到了类似类的概念,meth ...

  9. linux 查看网段内所有IP

    如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ 方法一: nmap –nsP 192.168.1.0/24 #从192.168.1.0到192.168.1.25 ...

  10. vue-resource: jsonp请求百度搜索的接口

    1. yarn add vue-resource 2. main.js引入vue-resource import Vue from 'vue' import MintUI from 'mint-ui' ...