容斥原理

|i=1nSj|=m=1n(1)m+1|ai<ai+1i=1mSai|

|i=1nSi|=|U||i=1nSi|

  • 全集减去补集的并就是集合的交

问题模型

  • 具有属性/限制条件
  • 我们可以对于每个属性建立一个集合,补集就是不满足这个属性的集合

不定方程非负整数解计数

给出不定方程 i=1nxi=mn 个限制条件 xibi ,求非负整数解

  • 属性有 n 个,分别是 xibi
  • 考虑容斥,全集是 (m+n1n1) ,现在目标是求出补集的并集,这个东西可以容斥
  • 考虑 |ai<ai+1i=1mSai| 这个东西怎么求,也就是一些补集的并的大小
  • 交集表示 xibi+1 的解的数,而交集表示同时满足这个条件,因此在这个不定方程中有些有下限制,有的没有
  • 因为都是非负整数,所以我们直接将下标减去,那么每个变量的下界就都是 0 ,因此对于这个交集的不定方程形式就是

i=1nxi=mi=1k(bai+1)

  • 这个显然是可以用组合数来表示的
  • 这个长度为 ka 数组其实就是在枚举子集

HAOI2008 硬币购物

  • 4 种面值,第 i 种面值是 Ci 。每次询问给出每个硬币的数量 Di 和一个价格 S ,问付款方案数
  • 每次背包不太行
  • 实际上就是在求 i=14Cixi=S,xiDi 的非负整数解的个数
  • 那么每次都像上面一样容斥一下,因为数量很少,所以枚举子集是足够的

错位排列的计数

  • 属性就是 iPi
  • 全集就是阶乘,套用上面的公式,其实就是要求补集的交集的大小
  • 此处的补集是 Pi=i 的方案集合。
  • 那么补集的交集(假设有 k 个)的大小就是 (nk)!
  • 那么整个式子就出来了,最终的式子是 n!k=0n1kk!

完全图子图染色问题

一个 n 个节点完全图,对于一个边集 SF(S) 为用 m 个颜色去染的方案数

染色的规则是相邻的颜色必须同色

如果 |S| 是奇数,那么 A 得分,否则 B 得分

问 A 和 B 的差值

  • Ans=SE(1)|S|1F(S)
  • 考虑将每一条边两边的端点的颜色相同作为一种属性,假设集合为 Q
  • 对于每条边我们映射成一个数字,假设是一组边集是集合 K={k1,k2,..},假设边集为 T={1,2,...,n(n+1)/2}
  • 那么 Ans=KTF(S)
  • 对于 F(S)=|i=1kQi|
  • 那么 Ans=SE(1)|S|1|i=1kQi|
  • 这个东西不就是 Ans=|i=1TQi|
  • 那不就是只要有一对端点颜色相同就可以了
  • 那么正常的容斥就可以了

容斥原理求最大公约数为 k 的数对个数

1x,ynf(k) 表示最大公约数为 k 的有序对数,求 f(1)f(n)

  • Ans= k  k 
  • 而公约数为 k 的倍数的个数就等于最大公约数为 k 的倍数的有序对数的和
  • 所以 f(k)=nk2×i=2ik<nf(ik)
  • k>n/2 ,可以直接算,因为后面不可能出现 k 的 2 倍在 n 以内
  • 所以我们可以倒推

容斥原理推导欧拉函数

  • φ(n)=d|n[gcd(d,n)]=1 ,先将 n 因式分解
  • 我们设属性为 pin 为一种属性,假设集合为为 S
  • 那么就是求 |i=1kSi|
  • 这个东西的全集就是 n ,那么其实就是要求补集的交,显然一个补集的交集就是同时是几个质数的倍数的个数,就是 nΠpi
  • 所以才有最后的欧拉函数的一个通式

φ(n)=n(11p1)...(11pk)

容斥原理一般化

f(S)=TSg(T)

那么

g(S)=TS(1)|S||T|f(T)

同理

f(T)=TSg(S)

那么

g(T)=TS(1)|S||T|f(S)

  • 我更愿叫它 "容斥反演"

DAG 计数

n 个点带标号的有向无环图进行计数,对 109+7 取模,n5×103

  • 因为每个 DAG 的入度/出度为 0 的节点是固定的,也就是特殊点
  • 我们考虑枚举一个,这里枚举入度
  • 思考入度为 0 的点个数大于等于 j 的方案数为先选择 j 个,这些点和剩下的点随便连边
  • g(i)=(ni)2(ni)iF(ni),F(ni)(ni)DAG
  • 但是我们发现这样会发生重复,并不是严格意义上的大于等于 j 的方案数
  • 但是事实上 g(i)=j=in(ji)f(j)f 为恰好的方案数
  • 那么反演过来就是 f(i)=j=in(1)ji(ji)g(j)
  • 最后的 F(n)=i=1nf(i)
  • 我们将每个 f 展开,然后发现最后 g(i) 的系数为 (1)i1(i1)+(1)i(i2)+....
  • 通过组合公式 i=0n(ni)=[n=1] ,可以具体求出每个的系数

F(n)=i=1n(1)i1(ni)2(ni)iF(ni)

二项式反演相关

P2167 [SDOI2009]Bill的挑战

  • 我们可以用上一题的思路来做
  • 既然是求恰好,那么我们就构造 f(k)=i=kn(ik)g(i)
  • 而这个题也很好构造这个东西,取所有长度为 k 的子集,算出来的字符串的和就是 f
  • 然后反演一下就可以了,总的复杂度为 O(215×50+n)O(n)

全序关系

对于任意 a,b,cX 都成立

  • 反对称性:若 ab,ba 那么 a=b
  • 传递性:若 ab,bc ,那么 ac
  • 完全性:abab

Min-Max 容斥

  • 对于满足全序关系并且其中元素满足可加减性的序列 {xi} ,设其长度为 n ,并设 S={1,2,3,..,n},则有

maxiSxi=TS(1)|T|1minjTxj

miniSxi=TS(1)|T|1maxjTxj

  • 对于期望仍然是有效的,因为满足全序且可加减

E(maxiSxi)=TS(1)|T|1E(minjTxj)

E(miniSxi)=TS(1)|T|1E(maxjTxj)

  • 注意到这里指的是期望的最大最小值,不是括号里的
  • 更强的

kthmaxiSxi=TS(1)|T|k(|T|1k1)minjTxj

kthminiSxi=TS(1)|T|k(|T|1k1)maxjTxj

  • 这个同样可以套上期望
  • 根据 minmax 容斥还可以知道

lcmiSxi=TS(gcdjTxj)(1)|T|1

  • 这里的 lcm,gcd,a1,a1 分别代表最大值,最小值,加,减
  • 具体的可以想象成对于每个质因数选出一个最大值,最后相乘
  • 而最大值容斥的时候最小幂次就可以表现成所有数的 gcd

一般的,我们一般会先将题目转换成求 E(max) 的形式,然后再用 Min-Max 容斥,因为 E(min) 会比较好求

对于一个集合第一个出现的期望步数,就是概率和再导过来,因为系数符合几何概率分布

P5643 [PKUWC2018]随机游走

  • 期望走几步走完集合 S ,其实就是求集合 S 中走到的步数期望值最大的,那么用 Min-Max 转换成求最小
  • 那么就可以反过来求集合 T 到 x 走到的期望
  • 直接求是 n3 ,因为是在图上,要高斯消元
  • 但是这里很特殊是棵树,所以我们完全可以以特殊的解法来解决
  • 我们以 x 为根,树上的每个节点的期望一定可以用形如 Affai+B 的形式表达,也就是用父亲来表达
  • 那么最后求到根,它的期望就是 B ,因为没有父亲
  • 可以预处理好每个集合对应的值,那么
  • 那么现在的复杂度就是 O(2nn)O(q2n)
  • 事实上我们发现这个式子其实就是一个子集前缀,那么用 FWT 或运算正变换一下,得到的 FWT 数组就是所有子集的答案
  • 那么复杂度就可以做到 O(2nn+nlogn)O(q)

P4707 重返现世

  • 首先可以用 Min-Max 转换成对于一个集合求 Min
  • 一个集合的一个元素取到的概率为 p ,那么期望次数就是 1p
  • 但是这里的 n 太大了,肯定没办法枚举子集
  • 观察到每个子集的贡献和 |T|p 有关
  • 那么设 dpi,j,k 表示前 i 个集合大小为 jp=k 的方案数
  • 然而你会发现这个是 O(nm2) ,需要优化
  • 考虑将这个 |T| 系数优化掉,(nm)=(n1m1)+(n1m) ,我们利用这个拆式子,但是这个 k 就不固定了
  • 观察到题目中 |nk|10 ,而我们一开始将 k=nk+1,所以 k10
  • 所以这个 k 是很小的,所以总的复杂度就为 O(nmk) ,空间拿滚动数组做

P3175 [HAOI2015]按位或

  • 这个东西明显套 Min-Max 容斥,改成求 Min
  • 对于一个集合的 Min 那不就是只要能对这个集合的做贡献的数的概率和倒过来
  • 你会发现这就是个子集前缀和的形式,用 FWT 正变化一下就可以得到之后的序列了
  • 总的复杂度为 O(2nn)O(2n)
posted @   Kzos_017  阅读(108)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示