F+1的颓废生活
最近干了四件事情:
一.二项式反演形式零与容斥原理的关系;
二.二项式反演形式一与形式二之间的联系;
三.二项式反演形式一,形式二与容斥原理的关系;
四.如何卡并查集纯路径压缩.
一.
从容斥原理开始.
\(|A_1\cup A_2\cup \cdots \cup A_n|=\sum_{1\le i\le n}|A_i|−\sum_{1\le i< j\le n}|A_i\cap A_j|+\cdots +(−1)^{n−1}\times |A_1\cap A_2\cap \cdots \cap A_n|\)
证明一:
设某一元素被\(m\)个集合所包含,则其对左侧的贡献为\(1\);
对右侧的贡献为\(\sum_{i=1}^m(−1)^{i−1}\tbinom mi=−\sum_{i=1}^m(−1)^i\tbinom mi=1−\sum_{i=0}^m(−1)^i\tbinom mi=1−(1−1)^m=1\).
证毕.
证明二(数学归纳法):
不想写了贴一个链接:容斥原理_百度百科 (baidu.com).
形式零:
沿用刚刚容斥的公式,记\(A^c_i\)表示\(A_i\)的补集,则将一般形式变形,可以得到:
\(|A^c_1\cap A^c_2\cap \cdots \cap A^c_n|=|S|−\sum_{1\le i\le n}|A_i|+∑_{1\le i< j\le n}|A_i\cap A_j|−\cdots +(−1)^n\times |A_1\cap A_2\cap \cdots \cap A_n|\)
同时,由于补集的补集就是原集,因此又有:
\(|A_1\cap A_2\cap \cdots \cap A_n|=|S|−\sum_{1\le i\le n}|A^c_i|+∑_{1\le i< j\le n}|A^c_i\cap A^c_j|−\cdots +(−1)^n\times |A^c_1\cap A^c_2\cap \cdots \cap A^c_n|\)
考虑一种特殊情况:多个集合的交集大小只和集合的数目有关.
记\(f_n\)表示\(n\)个补集的交集大小,\(g_n\)表示\(n\)个原集的大小,则两个公式分别可以写成:
\(f_n=\sum_{i=0}^n(−1)^i\tbinom nig_i\)
\(g_n=\sum_{i=0}^n(−1)^i\tbinom nif_i\)
显然这两个公式是等价关系,更是相互推导的关系,于是我们得到了二项式反演的形式零:
\(f_n=\sum_{i=0}^n(−1)^i\tbinom ni g_i\Leftrightarrow g_n=\sum_{i=0}^n(−1)^i\tbinom nif_i\)
通过代入证明的方法PYB的PPT上有,这里就不放了.
二.
形式一:
\(f_n=\sum_{i=0}^n\tbinom nig_i\Leftrightarrow g_n=\sum_{i=0}^n(−1)^{n−i}\tbinom nif_i\)
形式二:
\(f_n=\sum_{i=n}^m\tbinom ing_i\Leftrightarrow g_n=\sum_{i=n}^m(−1)^{i−n}\tbinom inf_i\)
我们假设有这样一道题目:有\(m\)个集合,集合的交集大小只和集合的数目有关,已知\(d_n\)表示集合数目至少为\(n\)的多个集合交集的大小,求集合数目恰好为\(n\)的多个及集合交集并的大小.
先考虑形式二.我们设\(g_i\)表示集合数目恰好为\(i\)的多个集合交集的大小的和,\(f_i\)表示集合数目至少为\(i\)的多个集合交集的大小的和,答案为\(g_n\).
\(f_i=\tbinom mnd_i\)
\(g_n=\sum_{i=n}^m(−1)^{i−n}\tbinom inf_i=\sum_{i=n}^m(−1)^{i−n}\tbinom in\tbinom mid_i\)
考虑形式一.我们假设我们已经确定了\(n\)个集合必选\(\tbinom mn\),设\(e_i\)表示集合数目恰好为\(m-i\)的多个集合交集的大小,\(h_i\)表示集合数目至少为\(m-i\)的多个集合交集的大小,答案为\(\tbinom mne_{m-n}\).
\(h_i=d_{m-i}\)
\(h_j=\sum_{i=0}^j\tbinom jie_i\)
\(\tbinom mne_{m-n}=\sum_{i=0}^{m-n}(−1)^{m-n−i}\tbinom {m-n}ih_i=\sum_{i=0}^{m-n}(−1)^{m-n−i}\tbinom mn\tbinom {m-n}id_{m-i}\)
不难发现两个式子本质相同,这就是为什么大多数题目中两者都可以推出正确答案的原因,也是为什么它们都被称为二项式反演的原因.
三.
先看形式二,\(f_n\)与\(g_n\)的定义与上面的定义相同,取\(n=0\)时即为容斥原理.或是把形式三看作确定了\(m\)个集合确定了\(n\)个后的形式一.
考虑对于形式一,\(f_i\)可以看作集合数目至多为\(i\)的多个集合的交集.考虑用集合补集来表示,即集合补集数目至少为\(m-i\)的多个集合补集的交集.
四.
Tarjan的卡法基于一种特殊定义的树.
定义:这种特殊的树为\(T_k\),其中\(T_1,T_2,\cdots ,T_j\)都是一个单独的点,对于\(T_k(k> j)\),\(T_k\)就是\(T_{k−1}\)再接上一个\(T_{k−j}\)作为它的儿子.
这种定义有一个有趣的特性,如果我们把它继续展开,可以得到各种有趣的结果.比如我们把上面图中的\(T_{k−j}\)继续展开,就会变成\(T_{k−j−1}\)接着\(T_{k−2j}\),以此类推可以展开出一串.而如果对\(T_{k−1}\)继续展开,父节点就会变成\(T_{k−2}\),子节点多出一个\(T_{k−j−1}\),以此类推可以展开成一层树.下面的图展示了展开\(T_k\)的不同方式.
我们用图5的方式展开出\(j\)棵子树,再按图4展开(假设\(j\)整除\(k\)).
如果在最顶上再加一个点,然后\(j\)次访问底层的\(T_1,T_2,⋯,T_j\).就可以把树压成图5的样子了,不过会多一个单点的儿子出来,因为图6中其实有两个\(T_j\)(因为图4展开到最后一层没有了\(−1\),所以会和上一层出现一次重复).这么一来,我们又可以做一次这一系列操作了(原论文里把这个叫做self-reproduction).
至于\(T_k=T_{k-1}+T_{k-j}=T_{k-2}+T_{k-j-1}+T_{k-j}=\cdots=T_{k-j}+\sum_{l=0}^{j-1}T_{k-j-l}\le (j+1)T_{k-j}\),\(T_j=1=(j+1)^0\),所以\(T_k\le(j+1)^{\frac kj-1}\).
令\(m\)代表询问操作数,\(n\)代表合并操作数,\(m\ge n\).我们取\(j=\lfloor \frac mn\rfloor,i=\lfloor log_{j+1}\frac n2\rfloor+1,k=ij\).那么\(T_k\le (j+1)^{i−1}=\frac n2\).接下来我们做\(\frac n2\)组操作,每组在最顶上加入一个点,然后对底层的\(j\)个节点逐一查询,每次查询的路径长度都是\(i+1\).同时总共的查询次数还是不超过\(m\).于是总共的复杂度是\(O(n+\frac n2j(i+1)=n+mlog_{1+\frac mn}n)\).
至于康老师为什么会认为路径压缩的并查集平均每次时间复杂度为\(O(1)\),最主要是因为忽略了每次路径压缩时会产生不只\(1\)条新边.
参考资料:
康复计划#4 快速构造支配树的Lengauer-Tarjan算法 - MoebiusMeow - 博客园 (cnblogs.com)
Worst-Case Analysis of Set Union Algorithms
二项式反演及其应用 - GXZlegend - 博客园 (cnblogs.com)