容斥原理

\(n\) 个奖项,获得 \(S\) 中的奖项的人数为 \(g(S)\) ,求获得至少一个奖项的人数。( 不妨认为\(g(\varnothing)=0\)

\[\sum_{S}(-1)^{|S|-1}g(S) \]

记容斥系数为 \(f(|S|)\),那么对于 \(\forall i \in[0,n]\) 应该有:

\[\sum_{j=1}^i\binom{i}{j}f(j)=[i \ge 1] \]

\(f(i)=(-1)^{i-1}\) 恰好满足。


错排问题:

\(f(i)\) 为至少有 \(i\) 个位置不满足的容斥系数

\[\sum_{i=0}^n f(i) \binom{n}{i} (n-i)! \]

\[\sum_{j=0}^i \binom{i}{j}f(j)=[i=0] \]

\[\Rightarrow f(i)=(-1)^i \]

变式:如果 \(k\) 个位置满足错排有 \(a_k\) 的贡献,求所有排列贡献和。

\[\sum_{j=0}^i \binom{i}{j}f(j)=a_i \]

可以递推计算 \(f\)

这就是一般化的容斥


快速计算 \(f\)

  1. 打表找规律

\[\begin{aligned} \sum_{j=0}^i \binom{i}{j}f(j)&=a_i \\ \sum_{j=0}^i\frac{1}{(i-j)!}\frac{f(j)}{j!}&=\frac{a_i}{i!} \end{aligned}\]

然后就可以多项式求逆做了。


条件的使用

T1 Emiya 家的饭

\(s_i=\sum_{j=1}^ma_{i,j}\)

\(dp_{i,j,k}\) :前 \(i\) 个方法,第 \(p\) 种食材选 \(j\) 个,其他食材选 \(k\)

\[dp_{i,j,k}=dp_{i-1,j,k-1}a_{i,p}+dp_{i-1,j-1,k}(s_i-a_{i,p})+dp_{i-1,j,k} \]

满足要求的状态为 \(j > k\) , 所以只需知道 \(j,k\) 相对大小,复杂度为 \(\mathcal O(n^2m)\)

T2

考虑容斥,枚举不被覆盖的格子的集合,对于剩余能放车的格子方案数为 \(2\)

同一列的格子联通,那么记选出的格子所在列构成的集合为 \(S\),这些列是无法放置車的。

现在我们先枚举 \(S\),然后再容斥。

此时可以对每一个行极大连通块独立考虑。具体的,对于一个含有 \(l\) 列 , 其中 \(p\) 列在 \(S\) 中的行,枚举这一行上的 \(p\) 个位置有哪一些位置选择了不覆盖,有两种情况:

  • 没有位置不覆盖,剩下的 \(l-p\) 个位置方案任意。

  • 存在至少一个位置不覆盖,那么这一行不能放车。

但这样计算会有问题,因为无法确定选出的点是否对应 \(S\),即 \(S\) 中可能存在若干列未选出不覆盖的点。

那么再次容斥,我们更改 \(S\) 的定义为不选車的列,并枚举未选出不覆盖点的列的集合 \(T (T \subseteq S)\)。记该行有 \(q\) 列在 \(T\) 中。

总贡献即为:

\[\begin{aligned}&2^{l-p}+\sum_{i=1}^{p-q}(-1)^i\binom{p-q}{i} \\ =&2^{l-p}-[p\not=q] \end{aligned}\]

再把所有行的贡献乘起来,意义显然。


一个行的贡献只与 \(l,p,q\) 有关,那么将原图划分成如下图形,使同颜色的行贡献相同:

这不就是小根笛卡尔树嘛!!!

\(f_{u,i,j}\) 表示以 \(u\) 为根的子树,有 \(i\) 列在 \(S\) 中,有 \(j\) 列在 \(T\) 中的贡献。

进一步,我们只需知道 \([p=q]\) ,那么第三维可以改为是否存在一列在 \(S\) 中却不在 \(T\) 中。

转移时枚举当前节点对应的列的选择情况即可。

时间复杂度 \(\mathcal O(n^2\log n)\)

T3

有一个 \(n \times m\) 的矩阵,填入 $[0,m] $ 中的数并满足:

  • \(a_{i,j} < a_{i,j+1}\)

  • \(a_{i,j}<a_{i-1,j+1}\)

求方案数。 \(1 \le n,m \le 10^6\)

每一行用 \(m+1\) 个数构成长度为 \(m\) 的上升序列,只需确定没有填的数就可以知道序列。

那么记 \(f_{i,j}\) 表示填完前 \(i\) 行,第 \(i\) 行未填的数为 \(j\) 的方案数,有:

\[f_{i,j}=\sum_{k=0}^{j+1}f_{i-1,k} \]

\[f_{i,j}=\begin{cases} f_{i-1,0}+f_{i-1,1} & j = 0 \\ f_{i,j-1}+f_{i-1,j+1} & j \not= 0 \end{cases}\]

问题转化为从 \((0,0)\) 走到 \(P(n+m+1,n)\) ,且不经过直线 \(l_1:y=x+1\)\(l_2:y=x-(m+2)\) 的方案数

将路径按经过直线顺序分类,并删去重复经过的部分。

所有不合法路径均可以分类为 \(1212...\)\(2121...\)

先考虑 \(1212...\),即先经过 \(l_1\)

  • \(1\) 为结尾 \(-\)\(21\) 为结尾 \(+\)\(121\) 为结尾 \(-\)\(2121\) 为结尾 ...

  • \(12\) 为结尾 \(-\)\(212\) 为结尾 + 以 \(1212\) 为结尾 \(-\)\(21212\) 为结尾

注意到将 \(P\)\(l_1\) 翻折后得到 \(P'\) , \(OP'\) 的结尾一定为 \(1\)\(12\),将 \(P'\)\(l_2\) 翻折得到 \(P''\), \(OP''\) 的结尾一定为 \(21\)\(212\)

那么我们不断翻折 \(P\) 即可,相信大家都知道关于直线 \(y=x+b\) 的对称点为 \((y_0-b,x_0+b)\)

终止状态为 \(P'(x',y')\) 不在第一象限,x,y正半轴内,因为此时会向左、下走。

每次翻折与对称轴的距离会增加 1,那么只会有 \(\mathcal O(n)\) 次操作。

状态的简并

T4

首先 \(\min-\max\) 容斥得到:

\[E(\max(S))=\sum_{T \subseteq S}(-1)^{|T|-1}E(\min(T)) \]

\(A_S=\sum_{i \in S}a_i\)

\(\displaystyle d=\frac{A_U}{A_T}\) ,表示选到 \(T\) 中元素的期望次数。

再考虑如何求 \(E(\min(T))\),一个转化是:

\[E(\min(T))=d\sum_{k \ge 0} P(\min(T) > k) \]

\(k\) 轮(均选中 \(T\) 中元素)没结束的情况是:所有数的和为 \(k\) 且每个数小于对应的 \(b_i\) ,概率即为:

\[\sum_{\sum c_i=k,c_i < b_i} \prod \left(\frac{a_i}{A_T}\right)^{c_i} \frac{k!}{\prod c_i!} \]

将每一位的贡献提出来,这样就可以按位计算:

\[\frac{k!}{{A_T}^k}\sum_{\sum c_i=k,c_i < b_i} \prod \frac{{a_i}^{c_i}}{c_i!} \]


\(f_{i,j}\) 表示前 \(i\) 个元素,\(c\) 的和为 \(j\) 的贡献,有:

\[f_{i,j}=\sum_{l=0}^{\min(b_i-1,j)} f_{i-1,j-l} \frac{{a_i}^l}{{A_T}^ll!} \]

这样我们得到了 \(\mathcal O(2^nn^2m^2)\) 的暴力


\[E(\max(S))=\sum_{T \subseteq S}(-1)^{|T|-1}\frac{A_U}{A_T}\sum_{k \ge 0}\frac{k!}{{A_T}^k}\sum_{\sum c_i=k,c_i < b_i} \prod \frac{{a_i}^{c_i}}{c_i!} \]

\[E(\max(S))=A_U\sum_{k \ge 0}k!\sum_{T \subseteq S}\frac{(-1)^{|T|-1}}{{A_T}^{k+1}}\sum_{\sum c_i=k,c_i < b_i} \prod \frac{{a_i}^{c_i}}{c_i!} \]

前面系数有关的量只有 \(k,A_T,|T|\),全部压进状态里:

\(f_{i,0/1,j,k}\): 前 \(i\) 个数,选中元素个数的奇偶,选中的元素的 \(a\) 的和为 \(j\) , \(\sum c=k\) 的贡献。

\[f_{i,0/1,j,k}=f_{i-1,0/1,j,k}+\sum_{l=0}^{\min(b_i-1,k)}f_{i-1,1/0,j-a_i,k-l}\frac{{a_i}^l}{l!} \]

答案即为:

\[E(\max(S))=A_U\sum_{k \ge 0}k!\sum_{j=1}^{S}\frac{1}{j^{k+1}}(f_{n,1,j,k}-f_{n,0,j,k}) \]

注意到容斥系数的改变为 -1,可以直接将第二维丢掉。

优化状态

T5

\(f_{u,i,S}\) 表示子树 \(u\) 内的点,\(u\) 对应的点为 \(i\),子树内对应的点的集合为 \(S\) 的方案数。

枚举子集转移,复杂度 \(\mathcal O(n^3 3^n)\)


如果去掉 \(S\),那么编号可能重复,考虑容斥,枚举所有点对应的点的集合。

\[\sum_{j=i}^n\binom{n-i}{j-i}f(j)=[i=n] \]

可得: \(f(i)=(-1)^{n-i}\) ,直接枚举 \(S\) 再 dp 即可。

复杂度 \(\mathcal O(2^nn^3)\)

容斥系数的处理

T6

先将 \(n!\) 唯一分解。

考虑到 \(a_i\) 相同时 \(b_i\) 无序,\(a_i\) 不同时 \(b_i\) 有序,那么直接看作 \(b_i\) 有序,最后答案除上 \(\prod_{}cnt[a_i]!\)

由于 \(m\) 不大,尝试划分为若干集合,且钦定每个集合的 \(b_i\) 相同。

第一部分:容斥系数

令大小为 \(i\) 的集合的容斥系数为 \(f_i\)

一个划分 \(T\) 为若干集合的集合 (\(\{S_1...S_k\}\)),定义它的容斥系数为集合的容斥系数之积,记为 \(g_T\)

那么一个划分被统计的贡献为:

\[\prod_{i=1}^k \sum_{T|S_i} g_T \]

只需满足:

\[\sum_{T|S_i} g_T=[S_i=1] \]

\[\begin{aligned} f_n+\sum_{i=1}^{n-1}\binom{n-1}{i-1}f_i(\sum_{T'|{S_i}'}g_{T'})=[n=1] \\ f_n+\sum_{i=1}^{n-1}\binom{n-1}{i-1}f_i[n-i=1]=[n=1] \\ f_n=[n=1]-(n-1)f_{n-1} \end{aligned}\]


第二部分:方案数

将同一个集合的 \(a_i\) 相加得到 \(A_i\)

每个质因子可以独立计算,相当于完全背包。

总时间复杂度 \(\mathcal O(\text{Bell(n)}nm)\)

注意到方案数只与 \(|S_i|\)\(A_i\) 有关,可以用一个状压 dp 合并方案。

大概是 map 套 set,为了卡常可以使用 hash 比较

这样的方案数大概是划分数级别?

posted @ 2022-07-15 15:03  chihik  阅读(57)  评论(0编辑  收藏  举报