Endless Pallet(min-max容斥)
地址:传送门
分析:
设$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容斥)的更多相关文章
- min-max 容斥
$\min - \max$ 容斥 Part 1 对于简单的$\min - \max$容斥有一般形式,表达为:$\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-1 ...
- 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 ...
- [模板] 容斥原理: 二项式反演 / 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 ...
- HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
- UVa12633 Super Rooks on Chessboard(容斥 + FFT)
题目 Source http://acm.hust.edu.cn/vjudge/problem/42145 Description Let’s assume there is a new chess ...
- hdu1695:数论+容斥
题目大意: 求x属于[1,b]和 y属于[1,d]的 gcd(x,y)=k 的方案数 题解: 观察发现 gcd()=k 不好处理,想到将x=x/k,y=y/k 后 gcd(x,y)=1.. 即问题转化 ...
- [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥
题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...
- 【LOJ2542】【PKUWC 2018】随机游走 min-max容斥 树上高斯消元
题目描述 有一棵 \(n\) 个点的树.你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(q\) 次询问,每次询问给定一个集合 \(S\),求如果从 \(x\) 出发一 ...
- min-max容斥学习笔记
min-max容斥学习笔记 前置知识 二项式反演 \[ f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^{ ...
- min-max容斥 hdu 4336 && [BZOJ4036] 按位或
题解: 之前听说过这个东西但没有学 令$max(S)$表示S中编号最大的元素,$min(S)$表示编号中最小的元素 $$max(S)=\sum{T \in S} {(-1)}^{|T|+1} min( ...
随机推荐
- 关于使用Java实现的简单网络爬虫Demo
什么是网络爬虫? 网络爬虫又叫蜘蛛,网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直 ...
- Leetcode 145. 二叉树的后序遍历
题目链接 https://leetcode-cn.com/problems/binary-tree-postorder-traversal/description/ 题目描述 给定一个二叉树,返回它的 ...
- BZOJ 4479: [Jsoi2013]吃货jyy
一句话题意:求必须包含某K条边的回路(回到1),使得总权值最小 转化为权值最小的联通的偶点 令F[i]表示联通状态为i的最小权值,(3^n状压)表示不在联通块内/奇点/偶点,连边时先不考虑必选的边的度 ...
- HDU 3394 双连通分量 桥 Railway
第一个答案是统计图中桥的个数 如果一个点-双连通分量中边的个数大于点的个数那么这个块中所有的边都是冲突的,累加到第二个答案中去. #include <iostream> #include ...
- Mybatis中接口和对应的mapper文件位置配置详解
Mybatis中接口和对应的mapper文件位置配置详解 原链接为:https://blog.csdn.net/fanfanzk1314/article/details/71480954 今天遇到一个 ...
- Leetcode3--->无重复字符的最长子串长度
题目:给定一个字符串string,找出string中无重复字符的最长子串. 举例: Given "abcabcbb", the answer is "abc", ...
- 【LeetCode】Remove Duplicates from Sorted Array(删除排序数组中的重复项)
这道题是LeetCode里的第26道题. 题目描述: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数 ...
- Learning Deconvolution Network for Semantic Segme小结
题目:Learning Deconvolution Network for Semantic Segmentation 作者:Hyeonwoo Noh, Seunghoon Hong, Bohyung ...
- ES6 异步编程之一:Generator
Generator 生成器是es6原生提供的异步编程方案,其语法行为和传统函数完全不同,阮大的<ECMAScript 6 入门>一书中对生成器有比较详尽的介绍,还有一些其他的文章可以参考, ...
- springboot添加外部jar包及打包
项目中除了从pom中添加依赖包,还可以添加本地的jar包,怎么做呢? 1.在src下新建目录lib,将jar包添加到lib中 2.在pom文件里添加配置以下属性,就可以使用jar包了 <depe ...