Loading

容斥原理

一些条件,都要满足

为什么容斥问题会有一套专门的计算方法?

其实容斥问题是一种常见子集答案总和的信息,常见的求解方法为DP。

在求解过程中往往需要利用之前已经有了的信息,尝试整体转移,以优化时间复杂度。

容斥模板

子集反演

\(f(S)\) 表示恰好选集合 \(S\)\(g(S)\) 表示至少选集合 \(S\)

\[f(S)=\sum_{S\subseteq T} (-1)^{|T|-|S|}g(T) \]

若钦定至多

\[f(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}g(T) \]

小星星


二项式定理的两种形式,\(g_i\) 为钦定选 \(i\) 个的方案数,\(f_i\) 为恰好选 \(i\) 个的方案数。
若钦定至少选 \(i\) 个。

\[g_i=\sum_{j=i}^{n}\binom{j}{i}f_j \Leftrightarrow f_i=\sum_{j=i}^{n}(-1)^{j-i}\binom{j}{i}g_j \]

若钦定至多选 \(i\) 个。

\[g_i=\sum_{j=0}^{i}\binom{i}{j}f_j\Leftrightarrow f_i=\sum_{j=0}^{i}(-1)^{i-j}\binom{i}{j}g_j \]


\(\text{min-max}\) 容斥

\[\min(k,S)=\sum (-1)^{|T|-k}\binom{|T|-1}{k-1}\max(T) \]


权值容斥(前缀和)
\(f\) 为权值 \(=K\)\(g\) 为权值 \(\le K\) 的方案数

\[f(K)=g(K)-g(K-1) \]


图容斥
求无向图联通方案数,\(f(S)\) 表示 \(S\) 联通方案数,\(g(S)\) 表示 \(g\) 中边任选方案数

\[f(S)=g(S)-\sum_{\operatorname{lowbit}(S)=\operatorname{lowbit}(T)}f(T)\times g(S-T) \]

\(g\) 和点数相关

\[f(i)=g(i)-\sum\binom{i-1}{j-1}f(j)\times g(i-j) \]

本质是代表元容斥。
\(\texttt{DAG}\) 数量,\(g(s,t)\) 表示 \(s\rightarrow t\) 的选边方案数:Finding satisfactory solutions

\[f(S)=\sum (-1)^{|T|+1}\times f(S-T)\times g(T,S-T) \]

\(g\) 和点数相关

\[f(i)=\sum (-1)^{j+1}\times f(i-j)\times \binom{i}{j}\times g(i,i-j) \]

本质是钦定至少有\(T\) 中的点入度为 \(0\)

列出容斥式

枚举刚好不合法

不等价时:即假设要求元素 \(\le a\),那我就使得元素至少 \(=a+1\) ,进行求解硬币购物

元素等价时:即要求所有元素\(\le a\),直接枚举至少 \(=a+1\) 的数的个数。\(\color{red}Slime段模型\)


局部合法——代表元容斥

整体都要合法的方案数 \(=\) 所有方案数 \(-\) \(\sum\) 代表元部分合法方案数 \(\times\) 另一部分无限制的方案数 \(\times\) 一个结合系数使得合起来不合法。

\[f_n=g_n-\sum_i f_i\times g_{n-i}\times c_{i,n-i} \]

\(\color{red}连通图计数\)

容斥计算

定义

根据定义式: \(\sum_{S\subset T}(-1)^{|S|}f_S\) 进行计算,复杂度\(\mathcal O(2^n)\)


集合大小等价合并

只与集合大小有关,而不关心里面的元素,可以合并,用组合数表示其系数,复杂度 \(\mathcal O(n)\)


增量法

每次往集合中加入元素进行考虑。

\(g_i=\sum\limits_{S\subset\{1,2,\cdots,i-1\},T=S\cup\{i\}}(-1)^{|S|}f_T\),表示为考虑前 \(i\) 个元素,确定 \(i\) 必选时的不满足条件的方案数量,在 \(g\) 之间进行 DP。


带容斥系数DP

就是将容斥系数当作方案的权值,变成一个方案权值和问题进行解决。

具体详见方案权值和问题。


仅仅转移容斥系数的DP

将方案的权值的一些相关信息作为DP的维度,将剩下的信息存入值进行转移:重返现世

容斥模型

Slime段模型

问题:对于一个有 \(m\)\(1\)\(n-m\)\(0\) 的,求 \(\forall k\in [1,n]\)其中最长的 01 段不超过 \(k\) 的方案数。

我们可以再\(k+1\)\(1\) 后面添一个 \(0\) 表示一段的结束。

\(S(n,t,k,m)=(-1)^t{n-tk\choose t}{n-t(k+1)\choose m-tk}\)

假设当前有 \(t\) 段不满足,带容斥系数方案数为 \(L(k,t)=S(n,t,k+1,m)-S(n-k-1,t-1,k+1,m-k-1)\)

因为还要考虑最后一个段后面不用加 \(0\) 需要将方案数加上,但这里是加上容斥系数\(-1\),所以为减。

答案为 \(A(k)=\sum_{t=0}^{\min((n-k-1)/(k+1)+1,m/(k+1)}L(k,t)\)。总复杂度 \(\mathcal O(n\log n)\)

ABC模型

[AGC058D] Yet Another ABC String

问题:请计算由 \(A\)A\(B\)B\(C\)C 组成的字符串 \(S\),满足子串不包含 ABCBCACAB 中的任意一个的\(S\) 个数。

\(n=A=B+C\)

由于 ABC BCA CAB可以重叠,即 ABCA,于是直接容斥“钦定极长的不满足条件段有 \(i\) 个”,因为长度不知道,我们和"Slime段模型",使得长度 \(\ge 3\) 即可,即抽出一个 A B C​ 各一个。

一开始不决定这各一个的 A B C 具体是 ABC BCA CAB 中的哪个,而是先决定剩下的 \(n-3i\) 个字符,显然随机排列,方案数 \({n-3i\choose A-i,B-i,C-i}\)

然后再将这 \(i\) 个极长的不满足条件段插进去,首先插在开头,则可以是 ABC BCA CAB 中的任意一种,否则为了不与上一个字符凑成一组不合法,只有且恰好有 \(2\) 种方式。

还要考虑无序,分成有没有放在开头讨论,最后这部分方案数为 \({n-2i-1\choose n-3i-1}2^i+3{n-2i-1\choose n-3i}2^{i-1}\)

答案为 \(\sum_{i=0}^{\min(A,B,C)}{n-3i\choose A-i,B-i,C-i}({n-2i-1\choose n-3i-1}2^i+3{n-2i-1\choose n-3i}2^{i-1})\)

容斥题目

P3244 落忆枫音:容斥,我觉得难点在容斥式。先假定给所有非 1 的点选择一个入边,再把不合法的情况——即有 \(x\to y\)\(y\to a\to \cdots \to x\) 的路径,成环,减去即可。

两种容斥思路

纵观各种容斥题,常见的思路只有两种,分别为:

(一)钦定容斥

形如:

\[ans=\sum_S(-1)^{|S|}f_S。 \]

其中我只考虑 \(S\) 并且怎么怎么样,不难发现发演以及上文两个”容斥模型“都是这种。

(二)DP容斥

不是一般的用 dp 算容斥,而是形如:

\[f(S)=g(S)-\sum f(T)\times g(S-T) \]

即每轮DP中都是用全部的方案减去仅局部合法的方案。之前我以为只有图容斥才是这样的,其实不然,考虑以下问题:

小明家养了 \(n\) 条狗,小明要给他们洗澡。

但是小明有点脸盲,并不会分辨这些狗。所以小明决定洗 \(n\) 次,每次随机选一只狗洗澡。

请问:最后有 \(\ge k\) 只狗被洗过澡的概率是多少?

\(g_i\) 表示钦定只有 \(i\) 条被选的方案数,则:

\[g_i=i^n-\sum_{j=1}^{i-1}{i\choose j}g_j\\ ans=\frac1{n^n}\sum_{i=k}^n{n\choose i}g_i \]

posted @ 2024-10-25 09:08  lupengheyyds  阅读(143)  评论(0)    收藏  举报