省选计划1.21

主题:容斥反演。

容斥

n 个集合的并集。

|pi|=S{1,2,,n}(1)|S|1|pSi|

S 不可为空

简单证明:

考虑一个元素出现在 pa1,pa2,,pax,考虑其的贡献。为 Sa(1)|S|1=i=1x(1)i1(xi)=1+i=0x(1)i1(xi)。根据二项式定理对其进行变形,1i=0x(1)i(xi)=1(11)x=1

有时候需要求集合的交集,令 AA 的补集,则 A=Api=pi,令 Z 为全集,则 |pi|=|Z||pi|

注意到在容斥式子中我们给出了 S 不可为空的限制,因为在大多数题目中,当 S 为空时可以直接求出 |Z|。如果可以,那么求交集时会有另一个式子:

|pi|=S{1,2,,n}(1)|S||pSi|

S 可以为空

不定方程计数。对 xi=S0xiK,对解计数,n,K105

xi>K 作为属性,求集合的并集,然后利用总方案数减去并集大小即可。注意所有方案均需满足 0xi,xi=S。如果钦定了 i 个位置满足 xi>K,那么直接插板即可,给出答案:

i=0n(1)i(ni)(Si(K+1)+n1n1)

给一张无标号图 G 和一张有标号树 T,求有多少种给 G 标号的方式使得 TG 的一棵生成树,n17

如果一开始就往容斥上想并不好做,考虑一个暴力的做法。

首先给图标号这种事情看上去无从下手,考虑先给图随便标一个号,然后统计有多少种映射合法。令 fi,j,S 代表 T 上的 i 映射到了 ji 的子树内的映射到的集合是 S 的方案数。转移做子树合并。时间复杂度 O(n33n)

考虑复杂度的瓶颈在于状态中的集合 S,其作用是为了避免重复,尝试用容斥去掉 S 这个限制。

g(S) 代表 T 中的所有点不必映射成 n 阶排列,而是只需映射到 S 这个集合中即可。那么答案就是 S(1)n|S|g(S),我们将映射后每个点是否被映射到视作属性,那么我们就是要求所有点都被映射到,g(S) 实际上同样等价于 S 没被映射到的方案数,做容斥即可,这也解释了容斥系数中的 (1)n|S| 从何而来。

考虑如何求 g(S),我们枚举 S,在做 dp 的过程中要求必须填 S 中的数即可。时间复杂度 O(n32n)代码

从暴力 dp 到正解中最关键的一步思考就是将映射成 n 阶排列这个条件变成所有 n 个点都被映射到

不妨考虑能否将 g 和答案的关系一般化。令 f(S) 代表映射到的集合恰好为 S 的方案数,g(S) 代表映射到的集合为 S 的子集的方案数,那么显然存在的关系是:

g(S)=TSf(T)

而我们刚才得到了这样的一个式子:

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

我们断言,任意对于某个集合的函数 f,g,若第一条关系成立,则第二条关系也成立。给出粗略证明:

f(S)=TS(1)|S||T|QTf(Q)

f(S)=QSf(Q)(TS/Q(1)|S/Q||T|)

对于关于集合 P 的函数 F(P)=TP(1)|T||P|,存在 F(P)=0|P|

证明

F(P)=i=0|P|(|P|i)(1)|P|i1i=(11)|P|=0|P|

所以 f(S)=QSf(Q)×F(S/Q)=f(S)

实际上,这是子集反演的一种形式。当我们将 g 看作至多,f 看作恰好时,这个式子会起很大的作用。

思考

容斥可以对于一些限制,将恰好转变成至少来放宽一些条件,以及后面反演中将涉及的 minmax 的转化。


凑容斥系数

刚才所有的容斥都是利用集合来理解的,考虑如下的理解方式:

要对所有物品在 C0 条件下的贡献求和,那么考虑构造一些其它条件 C1,C2,,Cn,并且有容斥系数 f1,f2,,fn,设 val(Ci) 是某个物品在 Ci 条件下的贡献,那么要有:

i=1nval(Ci)fi=val(C0)

如果能构造出 Cifi,同时能求出在每个 Ci 下的所有物品贡献之和 sumi,那么就有:

i=1nsumi×fi=sum0

在前文的容斥中,我们都是将 C0 视作对所有集合求交,同时容斥系数 fi{1,1},或者在此基础上做了一些本质区别不大的改变。

错排问题:求 piin 阶排列数。

在广义的容斥中,往往很多时候都将一个状态视作物品。在这里,我们将一个 n 阶排列视作一个物品。

直接的想法是让 C0 代表 piiCi 代表某一个子集满足 pii,这样的话并不能刻画出容斥系数,此时条件之间的运算本质上还是逻辑与

Ci 代表有 i 个位置代表满足 pi=i。此时对于一个物品(即状态),设其有 m 个位置满足 pi=i,那么其贡献到 j 上的并非 0/1,我们将其定义成 (mi),根据上文组合数学的经典式子 f(x)=i=0x(xi)(1)i=0x,取 fi=(1)i 即可。

注意到这个式子对于某个条件 Ci 也是很好单独求的。

错排问题加强:设一个 n 阶排列有 m 个位置满足 pii,那么该排列的价值为 am,求所有排列的价值之和。

使用和上面相同的定义。

i=0m(mi)fi=am

直接 O(n2) 求出 fi 即可。时间复杂度 O(n2)

反演

考虑 n 维向量 FH,设有线性变换 H=G×F,同时 G 可逆,那么有 F=G1×H,此时 G 就是变换,G1 就是反演。

二项式反演

定义在实数到实数的函数 fg 上,考虑有:

f(n)=i=0n(ni)g(i)

那么存在:

g(n)=i=0n(ni)(1)nif(i)

posted @   BYR_KKK  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示