@
普通容斥
容斥原理的本质是加上一堆模糊的可能取值,然后不断逼近真取值
也就是有一些只满足一部分条件的答案被多/少统计了,容斥原理可以处理此类问题
容斥原理由两部分构成,容斥系数和容斥统计的状态
用数学表达式来统计:
\(f(T)\) 要考虑把一些东西消掉,常用的有\(-1^{|T|}\)或者\(-1^{|T|-1}\)
\(w(T)\) 即为T状态对答案的贡献
怎么用容斥解题呢?
- 列出题目中所有条件,对每个条件分别求解
- 如上,考虑出现重复
- 于是枚举\(2^n\)个集合,相似的集合可以合并求解
- 贡献乘上容斥系数,求\(\sum\)
是⑧是很浅显?
例题选讲
欧拉函数
求1~n之间与n互质的数的个数
我们定义状态集合为包含几个因子
显然地,答案为\(n - \sum_x (gcd(n,x)\neq 1)\)
因为是第一个例题就详细理解一下吧
首先,答案一定包含于所有因子\(\le n\)的倍数中
而这些因子又有重复的
于是考虑把为同时两个因子的倍数减掉
那么又多减了同时为三个因子的倍数,要加上
然后类似地递归,数学归纳得到容斥的公式
枚举每个因⼦放与不放 ——apiadu
经典题目
N个变量xi,每个变量满⾜\(0\le xi\le Ci\)。
求\(\sum x=A\)的解的数量
然后考虑没有限制的时候怎么放
跟隔板法差不多,就是把A看成A个小球,求分割方案数
显然是\(C(A+1,N)\)
然后考虑钦定 \(K\) 个数,这些数的第i个必须\(\geq C_i\)
也挺好做的,先把A减去\(C_i\)就跟无限制一样了
这样是\(2^n\)的
好像还有第二档
因为某些原因鸽了(2019/7/30 要打CFdiv2(探底)于是没去答疑
QQ上问了杜老师还没回就先这样
SetAndSet
把n个数分成两个集合使得结果一样
分析一下?
结果一样必然二进制下每一位都一样
则套上容斥,对于每个条件考虑反面:所有1在一边,另一边全是0 或者没有
对于每一位同是1的连一条边,对于处理的K个数取出查看有多少个连通块
如果不符合条件的话,至少有一个连通块的数在一起
这是此时总方案数就是\(2^{连通块数}\)
然后外面再乘一个其他数随便分配的组合数就好了
ZJOI2016 小星星
n个点的树,求一个排列p,使树上有(u,v)的边,图里有(pu,pv)的边
出现=无限制-没有出现
全都没有限制\(dp[u][v]\) ->u对应v,已经求完了子树
\(dp[u][v]=\prod_{s \in son(u)} (\sum dp[s][t]*w[v][t])\)
\(w[v][t]\) 表示\(v\)和\(t\)在图上是否连通
解释一下,只在图上联通的儿子才加上它的dp值
有限制不能出现就把边删掉(开个vis)
复杂度\(2^n*n^3\) 空间\(O(n^2)\)
经典问题
把k分解成若干因数的乘积,因子有顺序求方案数
读入方式:\(n=p_1^{e_1}+p_2^{e_2}+p_3^{e_3}+...+p_m^{e_m}\)
\(\sum e_i \leq 1e5\)
看完题后直觉:不是沙雕dp吗?
dp做不了的。。
其实是容斥然后类似隔板法一样的来求方案数
固定\(i\)个因子为1
答案为\(\sum _{i=0} ^{m-1} ans_i*f(i)\) ,ans为固定i个为1的方案数,f是容斥系数
把 \(i\) 个1除掉之后的方案数,其他数没有限制的方案数就好算了啊QwQ
方案数等于\(C(k,i) * \prod _{j=1} ^m C(e_j+k-i-1,k-i-1)\)
即枚举k里选哪\(i\)个不是1,组合数求方案
经典问题2
给出全集大小,每次产生子集S的概率为P(S),求期望步数
容斥与期望结合
由于期望的线性性,容斥完取期望等于期望的容斥
考虑对每个子集T计算不止所有T的子集在T内的期望,那么要把重复的消掉
对于每个元素T,套路地使它在偶数时被消掉,奇数时加上(这个可以举几个例子来判断容斥系数,我比较菜所以不会推
然后枚举子集容斥就可以了
如上,\(P'(T)\)表示所有子集都在\(T\)内的概率,运用上一篇博客里的公式得到期望
Minmax 容斥
结论
\(Max(S)=\sum_{T \in S} Min(T) * f(i)\)
其中\(f\)为 容斥系数,此处取\(-1^{|T|-1}\)
同理,对于\(Min(S)\)也成立(但是用\(Max\)的情况较多
证明
首先证明可以取到\(Max(S)\),即对于只包含\(Max(S)\)的集合,\(Min(T)\)等于\(Max(S)\)
然后对于其他的值取最小值时,集合大小为奇数时加上,大小为偶数时减掉,而选奇数个和选偶数个的方案数又是一样的,于是抵消掉了
由期望的线性性可得,对于每个数取期望时也成立
例题选讲
simple例题
搞一个课堂上还记得的:
\(n\)道题,每道题听懂概率\(P_i\),求全部听懂次数
显然是每道题听懂期望次数的\(Max\),于是变成\(Minmax\)模板题
运用\(Minmax\)容斥可以把问题变成求一个集合中至少出现一个数的期望,就很简单了
[HAOI2015]按位或
显然为每个位置都取到1的期望步数,即为最晚的位置变成1的时间
那么\(E(Min)\)的取值就是\(\frac{1}{\sum _{g \and T≠ϕ} P[g]}\)
这个东西再套一层简单容斥然后转化成求T补集的子集,然后再用1减
这个子集前缀和就跟高维前缀和一样搞搞就行了
简单容斥——补集思想
杂题选讲
-
同色三角形
完全图每条边红黑染色,求同色三角形个数
不合法三角形:异色角/2 可以画图理解
然后枚举每个点枚举每条边,每个点答案贡献为红边*黑边/2
最后用C(n,3)减一下
-
CF297E
如果把每条线对应成一个点,若两条线交叉则在所对应的两点间连红边,否则连蓝边,那么我们就得到了一个含n个节点的完全图G。可以发现,第一种方案对应G中的一个红色三角形,第二种方案对应G中的一个蓝色三角形。
问题就转化成纯色三角形个数就好了
枚举一条线段,另一侧选两条
问题转化为求一些几何图形的方案数,笔记上是第一种和第三种
还有。。如果你不是正睿上课的同学
无可奉告I'm angry!
-
n点联通图计数
总图个数 - 不连通
令 f(n) = 连通图个数
$f(n) = 2^{C(n,2)} - \sum _{i=1}^{n-1} C(n-1,i-1) *f(i) *2^{n-1,2} $
欧拉图:度数都是偶数且联通
f(n) = 总的度数为偶数的个数
\(f(n) = 2 ^{C(n-1,2)}\)
先把\(n-1\)个点连完,如果度数奇数就和\(n\)连
\(f(n) = 2^{C(n-1,2)} - \sum _{i=1}^{n-1} C(n-1,i-1) *f(i) *2^{C(n-i-1,2)}\)
-
连边 bzoj2169
有N个点(编号1到N)组成的无向图,已经为你连了M条边。请你再连K条边,使得所有的点的度数都是偶数。求有多少种连的方法。要求你连的K条边中不能有重边
但和已经连好的边可以重。不允许自环的存在。求连边的方法数。我们只关心它模10007的余数。
令\(f[i][j]\)为选了i条边,j个点度数为奇数
\[f[i][j]=f[i-1][j-2]*C(n-j+2,2)+f[i-1][j]*(n-j)*j+f[i-1][j+2]*C(j+2,2)-f[i-2][j]*(C(n,2)-i+2) \]即分为以下情况讨论:
-
连两个度数为奇数的边 ,j-2
-
连一奇一偶,j不变
-
连两个偶数,j+2
-
减去连的重边 ,i-2选的情况和i选的情况有一部分是相同的
最后除以\(k!\)
-
-
树的最短路径期望
有一棵树,树的边权都是1,随机选k个点
在上面走,最路径时间走k个点,求期望时间
对于一条边,左右两边都有关键点,必须走两次
然后可以减去最远的两个点的路径长(期望的线性性)
就变成了\(\frac{C(n,k)-C(size_l,k)-C(size_r,k)}{C(n,k)}\) - \(\sum P(u,v)*w(u,v)\)
考虑在P(u,v)在选出来的点两两路径构成的树上成为直径的概率
如果(u,v)是直径,则有对于任意的x
\(d(u,x)\leq (u,v)\)
\(d(v,x)\leq d(u,v)\)
但是有重复,考虑令u的字典序最小,不妨设\(u<v\)
对于\(d(u,x)=d(u,v),d(v,x)<d(u,v)\),使\(x>v\)
同理对于\(d(u,x)<d(u,v),d(v,x)=d(u,v)\),使4x>u$
对于\(d(u,x)=d(u,v),d(v,x)=d(u,v)\),使\(x>max(u,v)\)
这样每棵树的每条直径都只算了一次
-
company Acquisitions
有若干公司,每个节点可能是根节点,也可能是自己点
每次选两个根,一个变成另一个的儿子,而它的儿子变成根
求只有一个根的期望步数
设计状态\(C(x)\) 为一个点为根且有i个儿子对答案的贡献
\(C(x)+C(y)=1+1/2*(C(x+1)+y*c(0))+1/2*(C(y+1)+x*c(0))\)
解得\(c(x)=1/2(c(x+1)+x*c(0)+1)\)
\(c(n-1) = 0\)
-
Segment
随机构造一个线段树:有\((1,n)\)个线段,每次选中间一个点\(x\)(随机),然后递归下去选,直到\(l=r\)
\(q\)次询问问区间\((l,r)\)会访问几个区间
考虑询问\([x,y]\),\(l\leq x,r\geq y\),一定被经过
相交的区间也一定被经过
包含于它的区间取决于树的形态
怎么拆后者的期望?答案是叶节点 - 包含且非叶区间个数
问题好像就很显然了?(
常见的转化。——apiadu
得到答案\(=\)与\((l,r)\)相交或包含$(l,r) - \(被\)(l,r)$严格包含且非叶节点 + 包含叶子个数
定义第一类区间权值为1,第二类-1,第三类1
用期望线性性拆开,相当于求\([x,y]\)出现的概率,乘上对应的权值(1或者-1)
怎么求概率呢?
考虑随机生成割开位置的排列
则x,y 区间出现意味着x-1号隔板和y号隔板比他们中间的模板都先出现
左右端点特殊考虑一下!
可惜的是这题并不能\(n^2*m\)做
至于剩下考虑如何快速算出来,搞搞前缀和
技术性细节不讲 ——apiadu
按时间分治
考虑离线,边加入和删除,可以理解为在一段时间内存在这条边
然后对时间建线段树,然后dfs时间线段树
访问到T把T所有边加入并查集
访问左右节点,访问完左节点撤销左节点操作(不能路径压缩并查集!)(要按秩合并 撤销的时候判断一下
在叶节点回答查询就可以了
后记
有用的东西:期望 = 总和 / 总方案数
下午四点之后杜教就开始放飞自我力(悲
然后我就自闭了