地址:传送门

分析:

设$x_i$表示第i个点被染成黑色的时间,所求即为$E(max \left \{x_i  \right \})$

因为$E(X)=\sum_{k=1}^{\infty}i \times P(X=k)=\sum_{k=1}^{\infty}P(X\geqslant k)$,所以即求$\sum_{k=1}^{\infty}P(max\left \{ x_i \right \}\geqslant k)$

我们来考虑$P(max\left \{ x_i \right \}\geqslant k)$如何求

$P(max\left \{ x_i \right \}\geqslant k)=1-P(max\left \{ x_i \right \}<  k)$

$P(max\left \{ x_i \right \}<  k)=P(x_1<k,x_2<k,...,x_n<k)=\sum_{T \subseteq X}(-1)^{|T|}P(t_1\geqslant k,t_2 \geqslant k,...,t_{ |T|} \geqslant k )$

其中后面一部分是容斥原理

那么我们可以暴力枚举子集,算后面的那一坨的概率

假设固定了T,那么我们计算出从$\frac{n(n+1)}{2}$个染色方案中可以选取A个,使得没有包含T中任何一个元素

那么后面那一坨的概率就是$(\frac{2 \times A}{n(n+1)})^{k-1}$

我们发现,当我们枚举$k=1,2,...,\infty $的时候,这是一个等比数列,所以对答案的贡献是$\frac{1}{1-(\frac{2 \times A}{n(n+1)})}$

注意,当$A=\frac{n(n+1)}{2}$的时候,是不成立的,因为不是等比数列,这种情况下对于每一个k,这一项的贡献都是1,正好与$P(max\left \{ x_i \right \}\geqslant k)=1-P(max\left \{ x_i \right \}<  k)$里面的1相抵消

于是我们得到了一个最终的式子:$\sum_{k=1}^{\infty}P(max\left \{ x_i \right \}\geqslant k)=\sum_{T \subseteq X,T\neq \varnothing }(-1)^{|T|+1}\frac{1}{1-(\frac{2 \times A_T}{n(n+1)})}$

其中$A_T$是子集T对应的A

我们需要想办法优化这个指数级别的算法,注意到对答案有影响的只有$A$和$|T|$,我们可以考虑用树形dp计算出有同样的A和|T|的有多少个集合

考虑一个子问题:给你一个树,有一些点是关键点,你需要统计出有多少条链不经过其中任何一个关键点

这个问题是可以树形dp解决的,状态需要保存以u为根的子树中,与u连通的非关键点形成的连通块的大小

于是对于我们这个问题,我们设$dp[i][j][A][0/1]$表示以i为根的子树,与i相连的没被选入点集的连通块大小为j,已经有了A条不经过点集中点的链,选取的点的数量的奇偶性是0/1情况下的点集有多少个

然后就可以对于dp出的值算贡献了

这个dp看似是$O(n^7)$的,但是它实际的复杂度是$O(n^5)$,原因与广外人知的树形背包的复杂度分析相同。(tip:不妨考虑我现在有n个数字1,每次需要把两个数字相加合成新的数字,代价是两个数字的乘积。问我最终合并成1个n,最少要花费多少代价。这个问题的答案是固定的,答案是$O(n^2)$级别的,这个问题等价于基于子树大小的树背包,所以树背包的复杂度是$O(n^2)$而不是$O(n^3)$)。

 #include<bits/stdc++.h>
using namespace std;
const int maxn=;
const int mod=;
int dp[maxn+][maxn+][][];
int tmp[maxn+][][];
int inv[maxn*maxn+];
int sz[maxn+];
vector<int> g[maxn+];
int n;
int mul(int a,int b)
{
return 1LL*a*b%mod;
}
int add(int a,int b)
{
return (a+b)%mod;
}
void merge(int a[maxn+][][],int b[maxn+][][],int n,int m)
{
for(int i=;i<=n+m;++i)
for(int j=;j<=(n+m)*(n+m+)/;++j)
tmp[i][j][]=tmp[i][j][]=;
for(int i=;i<=n;++i)
for(int j=;j<=n*(n+)/;++j)
for(int k=;k<;++k)
if(a[i][j][k])
for(int x=;x<=m;++x)
for(int y=;y<=m*(m+)/;++y)
for(int z=;z<;++z)
if(b[x][y][z])
tmp[i?i+x:][j+y+i*x][k^z]=add(tmp[i?i+x:][j+y+i*x][k^z],mul(a[i][j][k],b[x][y][z]));
for(int i=;i<=n+m;++i)
for(int j=;j<=(n+m)*(n+m+)/;++j)
for(int k=;k<;++k)
a[i][j][k]=tmp[i][j][k];
}
void dfs(int k,int fa)
{
sz[k]=;
dp[k][][][]=;
dp[k][][][]=;
for(auto u:g[k])
{
if(u==fa) continue;
dfs(u,k);
merge(dp[k],dp[u],sz[k],sz[u]);
sz[k]+=sz[u];
}
}
int main()
{
inv[]=;
for(int i=;i<=*(+)/;++i) inv[i]=mul(mod-mod/i,inv[mod%i]);
int T;
scanf("%d",&T);
for(int cas=;cas<=T;++cas)
{
printf("Case #%d: ",cas);
scanf("%d",&n);
for(int i=;i<=n;++i) g[i].clear();
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
for(int k=;k<=n*(n+)/;++k)
for(int l=;l<;++l)
dp[i][j][k][l]=;
for(int i=;i<n;++i)
{
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(,);
int ans=;
int s=n*(n+)/;
for(int i=;i<=n;++i)
for(int j=;j<s;++j)
for(int k=;k<;++k)
{
int tmp=mul(s,inv[s-j]);
tmp=mul(tmp,dp[][i][j][k]);
if(k==) tmp=-tmp;
ans=add(ans,tmp);
}
if(ans<) ans+=mod;
printf("%d\n",ans);
}
return ;
}

Endless Pallet(min-max容斥)的更多相关文章

  1. min-max 容斥

    $\min - \max$ 容斥 Part 1 对于简单的$\min - \max$容斥有一般形式,表达为:$\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-1 ...

  2. Min-max 容斥与 kth 容斥

    期望的线性性: \[E(x+y)=E(x)+E(y) \] 证明: \[E(x+y)=\sum_i \sum_j(i+j)*P(i=x,j=y) \] \[=\sum_i\sum_ji*P(i=x,j ...

  3. [模板] 容斥原理: 二项式反演 / Stirling 反演 / min-max 容斥 / 子集反演 / 莫比乌斯反演

    //待更qwq 反演原理 二项式反演 若 \[g_i=\sum_{j=1}^i {\binom ij} f_j\] , 则有 \[ f_i=\sum_{j=1}^i (-1)^{i-j} {i \ch ...

  4. HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

  5. UVa12633 Super Rooks on Chessboard(容斥 + FFT)

    题目 Source http://acm.hust.edu.cn/vjudge/problem/42145 Description Let’s assume there is a new chess ...

  6. hdu1695:数论+容斥

    题目大意: 求x属于[1,b]和 y属于[1,d]的 gcd(x,y)=k 的方案数 题解: 观察发现 gcd()=k 不好处理,想到将x=x/k,y=y/k 后 gcd(x,y)=1.. 即问题转化 ...

  7. [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥

    题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...

  8. 【LOJ2542】【PKUWC 2018】随机游走 min-max容斥 树上高斯消元

    题目描述 有一棵 \(n\) 个点的树.你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(q\) 次询问,每次询问给定一个集合 \(S\),求如果从 \(x\) 出发一 ...

  9. min-max容斥学习笔记

    min-max容斥学习笔记 前置知识 二项式反演 \[ f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^{ ...

  10. min-max容斥 hdu 4336 && [BZOJ4036] 按位或

    题解: 之前听说过这个东西但没有学 令$max(S)$表示S中编号最大的元素,$min(S)$表示编号中最小的元素 $$max(S)=\sum{T \in S} {(-1)}^{|T|+1} min( ...

随机推荐

  1. manjaro(arch)里的vbox 安装centos7后,centos无法联网的解决办法

    第一步,在VirtualBox中设置网卡连接方式:点“设置”,在弹出的界面中点“网络”,最后选择“连接方式”为“桥接网卡”. 回到centOS中,进入终端,输入命令:ip addr,查看网络配置文件的 ...

  2. leetcode-12-stack

    409. Longest Palindrome Given a string which consists of lowercase or uppercase letters, find the le ...

  3. MDK editions for Nuvoton devices

    10 Sep 2018 MDK editions for Nuvoton devices For users of Nuvoton devices, Keil® MDK increases its a ...

  4. C++中重载、覆盖和隐藏的区别,以及适用场景

    一.重载.覆盖和隐藏的区别 二.适用场景 1.重载: 适用于不同的数据类型都需要使用到的功能函数.以数据相加的函数为例,可以在同一个文件内提供以下的重载函数以支持同样的功能: int add(int, ...

  5. vagrant 安装ubuntu12.04 64 bit

    1 下载用于ubuntu 12.04 用于vagrant的镜像,虚拟机是virtualbox $ wget http://files.vagrantup.com/precise64.box jb@e3 ...

  6. selenium2 TestNG参数化

    想要参数化,首先要加入@Parameters({"参数1","参数2"}) package com.demo.test; import java.util.co ...

  7. POJ 2763 树链剖分 线段树 Housewife Wind

    单个边的权值修改以及询问路径上的权值之和. 数据量比较大,用vector存图会超时的. #include <iostream> #include <cstdio> #inclu ...

  8. 精通 JavaScript中的正则表达式

    精通 JS正则表达式 (精通?标题党 ) 正则表达式可以: •测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证  ...

  9. rocketmq源码分析3-consumer消息获取

    使用rocketmq的大体消息发送过程如下: 在前面已经分析过MQ的broker接收生产者客户端发过来的消息的过程,此文主要讲述订阅者获取消息的过程,或者说broker是怎样将消息传递给消费者客户端的 ...

  10. 图解spring事务管理的实现