【总结】组合计数
一些图计数
求 \(n\) 个点的连通无向图个数,点带标号。
\(f_i\):\(i\) 个点的带标号无向图个数
\(g_i\):\(i\) 个点的带标号连通无向图个数。
有转移式:$$ f_i = \sum_{x=1}^{i} f_{i-x} g_x \binom{i-1}{x-1} $$
移项得:$$ g_i=f_i - \sum_{x=1}^{i-1} f_{i-x} g_x \binom{i-1}{x-1} $$
而我们有 \(f_i=2^{\frac{i(i-1)}{2}}\),\(g_1=1\),所以可以 \(\mathcal O(n^2)\) 递推出 \(g\)。
求 \(n\) 个点的强连通竞赛图个数,点带标号。
\(f_i\):\(i\) 个点的竞赛图个数。
\(g_i\):\(i\) 个点的强连通竞赛图个数。
转移式:$$ f_i = \sum_{x=1}^{i} f_{i-x} g_x \binom{i}{x} $$
递推式:$$ g_i=f_i - \sum_{x=1}^{i-1} f_{i-x} g_x \binom{i}{x} $$
有 \(f_i=2^{\frac{i(i-1)}{2}}\),\(g_1=1\)。
求 \(n\) 个点的二分图个数,点带标号。
\(f_i\):\(i\) 个点的二分图个数。
\(g_i\):\(i\) 个点的连通二分图个数。
\(f'_i\):\(i\) 个点的二分图二染色个数。
\(g'_i\):\(i\) 个点的连通二分图二染色个数。
\(\displaystyle f'_i = \sum_{x=0}^i \binom{i}{x} 2^{\frac{x(i-x)}{2}}\),可以依次递推出 \(g', g, f\)。
求 \(n\) 个点的 DAG 个数,点带标号。
\(f_i\):\(i\) 个点的 DAG 个数。
考虑剥掉所有入度为 0 的点,剩下的图仍然是个 DAG。但是没法保证把所有入度为 0 的点全部剥掉了,因此需要容斥:$$ f_i=\sum_{x=1}^i (-1)^{x-1} \binom{i}{x} f_{i-x} \ 2^{x(i-x)} $$
容斥系数:
对于一个入度为 0 的点恰有 \(k\) 个的 DAG,其方案数被计算的次数为: $$ c_k=\sum_{i=1}^k \binom{k}{i} v_i $$
其中 \(v_i\) 是钦定有 \(i\) 个入度为 0 的点时的容斥系数。
我们希望 \(\forall k, c_k=1\)。由二项式定理,我们可以得到 \(v_i=(-1)^{i-1}\) 时满足条件,是我们需要的容斥系数。
求 \(n\) 个点的树个数,点带标号。
prufer 序列:每次删掉一个编号最小的叶子并把它连向的点的编号加入序列,最后剩两个点的时候停止。
这样的长度为 \(n-2\) 的序列与树结构一一对应,因此 \(n\) 个点的树个数(带标号)为 \(n^{n-2}\)。
给定 \(k\) 个连通块,第 \(i\) 个连通块大小为 \(a_i\),块内的边已经确定。求满足给定边的大小为 \(n=\sum a_i\) 的生成树个数。
还是考虑 prufer 序列,不过每次删掉的是一个给定的 \(k\) 个连通块中的一个,满足它当前只有一条边连向其他连通块。删除时加入这个连通块连向的块外点。这样的 \(n^{k-2}\) 个序列正好对应将连通块串起来的方案,但是每个连通块还要选择连出去的点,因此最终总方案数是 \(n^{k-2} \prod a_i\)。
corner:在 \(n=1\) 的时候不能用 prufer 来理解,但是发现 \(n^{-1}\) 和 \(\prod a_i = n\) 正好抵消了,因此算出来仍然是对的。
题目:qoj990
题意:求有多少种将 \(n\) 个点连成树的方案,使得同色连通块大小不超过 \(K\)。\(n \le 300\)。
我们已经知道了在连通块分别钦定好之后如何计算树个数,但是发现我们无法令同色的、钦定好的连通块之间不连边,因此仍然有不合法情况,需要容斥。
令 \(g_k\) 表示钦定一个大小为 \(k\) 的连通块时对答案的贡献系数(已经乘有 \(k\) 作为对 \(\prod a\) 的贡献),\(f_{k,i}\) 表示一个大小为 \(k\) 的极大同色连通块 划分成 \(i\) 个被钦定的连通块 时 的方案数 再乘上 \(\prod a\) 的总和。
那么一个大小为 \(k\) 的极大同色块被计算的总次数为:$$ c_k=\sum_{i=1}^k f_{k,i} \cdot k^{i-2} $$
而我们希望的计算次数:
又,对于 \(i\ge 2\) 有:$$ f_{k,i} = \sum_{j=1}^{k-1} f_{k-j,i-1} \binom{k-1}{j-1} g_j $$
因此我们可以利用 \(g_{1\sim (k-1)}\) 计算出所有 \(f_{k, \ge 2}\),然后再用 \(c_k\) 的限制算出 \(f_{k, 1}\)。又,\(g_k=f_{k,1}\),所以得到了 \(g_{1\sim k}\),可以进一步递推了。
这样递推可以得到所有的 \(f, g\)。
得到这些之后,回过头来看原先的题目。显然钦定同色连通块时各个颜色是独立的。由于我们算最终方案时需要“连通块个数”这一项,因此我们要计算的东西形如:把 \(cnt_{col}\) 个点钦定成 \(i\) 个连通块的方案数 乘上 \(\prod a\) 的结果。这和 上面 \(f\) 的定义恰好相同,所以我们可以直接使用计算完的 \(f\)。最后把所有颜色的计算结果拼起来即可。
小细节:把各个颜色拼起来的时候不需要进行卷积(因为最后求的实际上就是将 \(n\) 代入得到的值),令 \(\displaystyle ans_{col} = \sum_{i=1}^{cnt_{col}} f_{cnt_{col}, i} \ n^i\),那么最终结果就是 \(\prod ans \cdot n^{-2}\)。
时间复杂度瓶颈在于计算 \(f, g\),为 \(\mathcal{O}(n^3)\)。
min-max 容斥
考虑第 \(x\) 大的数在这个式子中被计算的次数:
所以当 \(x<k\) 或 \(x>k\) 时,\(c_x=0\);\(x=k\) 时 \(c_x=1\)。
首先把“只能杀死活着的猎人”转成“每次可以杀死的猎人为全集,若选中已经死了的猎人就不执行该操作”,最后的概率是不变的。 令 \(p_i\) 表示 \(i\) 在一次操作中被选中的概率。
设 \(f_1\) 表示 \(1\sim n\) 全部被杀死的期望步数,\(f_2\) 表示 \(2\sim n\) 全部被杀死的期望步数。\(1\) 是最后一个被杀死的当且仅当 \(f_1>f_2\)。
而当 \(2\sim n\) 都被杀死之后,杀死 \(1\) 的期望步数为 \(\displaystyle \frac{1}{p_1}\)。故 \(1\) 最后一个被杀死的概率就是 \(\displaystyle \frac{f_1-f_2}{\frac{1}{p_1}}\)。(\(1\) 不是最后一个被杀死时 \(f_1-f_2=0\),其他情况平均贡献为 \(\displaystyle \frac{1}{p_1}\)) 。
然后使用 min-max 容斥求 \(f_1, f_2\) 即可。
再后面的优化不会了。
矩阵树定理
对一张带权有向图构造矩阵 \(D\):
那么 \(\det(D)\) 即为这张图的 所有内向生成树 边权积的和。
证明:
写出行列式的计算式:$$ \det(D)=\sum_{\pi \in \Pi} (-1)^{\sigma(\pi)} \prod_{i=1}^n D_{i, \pi_i} $$
其中 \(\sigma(\pi)\) 为排列 \(\pi\) 的逆序对数。
考虑这个排列和要计数的树之间的关系:
实际上这个 \(\pi_i\) 相当于给 \(i\) 指定了一条 \(i \to \pi_i\) 的父向边,当这种边不出现环的时候就是一棵合法的内向生成树。但是我们没法保证不出现环,因此需要容斥。
具体地,我们将这个排列 \(\pi\) 产生的所有大小 \(>1\) 的置换环视为钦定出现的环,所有大小为 \(1\) 的置换环(单点)视为随意指定父亲的点(即容斥中没被钦定的部分)。那么在去掉所有 \((-1)\) 系数的情况下这些方案的边权积的和即为 \(\prod_{i=1}^n D_{i, \pi_i}\)。我们希望所有环数 \(>0\) 的基环森林最终被计算的次数都为 \(0\),环数 \(=0\) 的合法树最终被计算的次数为 \(1\);由二项式定理,我们需要的容斥系数为 \((-1)^{cnt'(\pi)}\),其中 \(cnt'(\pi)\) 为钦定的环数量,即 \(\pi\) 中大小不为 \(1\) 的置换环的个数。
下面考虑行列式计算式中的 \((-1)^{\sigma(\pi)}\) 和 这个容斥系数的关系:
首先我们有:\(\sigma (\pi)\) 的奇偶性和 \(n-cnt(\pi)\) 相同,其中 \(cnt(\pi)\) 为 \(\pi\) 的置换环个数。
这是因为我们交换一个排列的两个数一定会使:逆序对个数奇偶性改变、置换环个数 +1/-1;而我们又知道当 \(\pi\) 满足 \(\forall i, \pi_i=i\) 时,其逆序对数为 \(0\),置换环数为 \(n\)。
接下来我们进行推导:
(\(c\) 表示行列式中带有的所有 \((-1)\) 的积,\(len(\pi)\) 表示 \(\pi\) 中大小不为 \(1\) 的环的总环长)
即:行列式中所带的系数 等于 我们所需要的容斥系数。
这样,我们就证明了 \(\det(D)\) 等于 图中 所有内向生成树 边权积的和。
平方和相关
求 \(\displaystyle \sum_{T \subseteq S} |T|^2。\)(交换求和号)
更一般的形式:拓展到 \(k\) 次方
左边代表将 \(k\) 个不同的球放入 \(x\) 个不同的盒子中(允许空盒)的方案数。
右边代表先从 \(x\) 个盒子里选 \(j\) 个不为空的盒子,乘以将 \(k\) 个不同的球放入相同的 \(j\) 个盒子(不允许空盒)的方案数,最后将这 \(j\) 个盒子加以区分乘上 \(j!\),最终得到的结果和左边的组合意义一样。
这个式子将 \(x^k\) 转为 \(x\) 选 \(j\) 的组合意义形式,然后就可以只计算有关钦定 \(j\) 个位置的方案和,不用再关心 \(k\) 次方本身了。
题目:gym 102769 H
考虑像上面一样交换求和号,即对于一对 \((i,j)\) 求 钦定 \(a_i=t\) 且 \(a_j=t\) 时的方案数。
以下令 \(p_i=\displaystyle \max_{j=1}^{i} a_i\)。
主要比较麻烦的是 \(p_i-p_{i-1}\le 1\) 的限制。不过我们注意到一件事情:若 \(a_i=t\) 且 \(p_{i-1}\ge t\),则把 \(a_i\) 从序列里删掉并不影响整个序列的合法性,从而不影响剩下位置的方案数,因此当我们钦定一个位置 \(i\) 的值为 \(t\) 时,我们只关心当前 \(a_i\) 是否是前缀最大值(只有这个因素会影响方案数)。
那么对于每个 \(t\),枚举前缀最大值恰好变成 \(t\) 的位置 \(k\)(即 \(p_k=t\) 且 \(p_{k-1}=t-1\) 的位置),分类讨论一下钦定为 \(t\) 的两个位置 \(i, j\) 与 \(k\) 的位置关系,然后前后分别计算方案数即可。
具体地,设 \(f_{i,j}\) 表示 从前往后 放到位置 \(i\),前缀最大值为 \(j\) 的方案数;\(g_{i,j}\) 表示 从后往前 放到位置 \(i\) 时,位置 \(i\) 恰好是第一个前缀最大值为 \(j\) 的位置的方案数。这两个数组都可以简单预处理出来,枚举 \(t, k\) 之后可直接用来计算。
预处理和回答的复杂度都是 \(\mathcal{O}(n^2)\) 的。
题目:
\(n\) 个点的有向图,一些点是终止点,每个点有一个权值 \(v_i\)。从一号点开始,每次随机选择一条出边走过去,直到到一个终止点为止。问路径上所有点的权值和的期望以及平方和的期望。\(n\le 500\)。
这里不再像上面两题一样 将平方和完全拆成 \(i, j\) 之间的贡献,而是利用权值和的状态将 \(j\) 这一维度聚合(?),在 \(i\) 处统计贡献。
设 \(A_i\) 表示从点 \(i\) 走到终止点的权值和的期望,\(B_i\) 表示从点 \(i\) 走到终止点的权值平方和的期望。则有转移:$$ A_i=v_i + \sum_{(i,j)\in E} \frac{1}{d_i} \cdot A_j$$
由于原图不是 DAG,需要高斯消元。
Bonus:设终止点集合为 \(S\),给定一个集合 \(T\subseteq S\),只有当路径终点在 \(T\) 中时这条路径才有贡献。
多设一个变量 \(C_i\) 表示 从 \(i\) 出发 终止点位于 \(T\) 中的概率。那么有:$$ A_i=\sum_{(i,j)\in E} \frac{1}{d_i} \cdot (A_j+C_j\cdot v_i) $$
同样高斯消元即可。
杂
题目:X and Xor
给定 \(n, m\),对于所有长为 \(n\) 且 满足 \(\forall i, A_i\in [0, 2^m)\) 的数列 \(A\),求以下值的和(对 \(998244353\) 取模):$$ \bigg((A_1\times A_2) \oplus (A_2\times A_3) \oplus ... \oplus (A_{n-1}\times A_n)\bigg) \bmod 2^m $$ 其中 \(\oplus\) 表示异或运算。\(\mathcal{O}(m\log n)\)。
首先拆位,要对每一位算其为 \(1\) 的方案数。我们直接算概率,最后乘以总方案数即可。
同时我们有:\(\displaystyle p_1=\frac{p_1-p_0+1}{2}\),这启发我们可以通过算 \(p_1-p_0\) 来计算 \(p_1\),可以把一些比较对称的情况抵消掉。
令 \(lowbit(i)\) 表示 \(i\) 中最低位的 \(1\) 所在的位置。
如果要考虑进位的话 情况比较复杂,因此我们先对不受进位影响的 lowbit 进行考虑。设当前考虑的位为 \(x\),则有:
- \(x<lowbit(A_i)+lowbit(A_{i-1})\) 时,这个缝隙不对 \(x\) 造成贡献;
- \(x=lowbit(A_i)+lowbit(A_{i-1})\) 时,\(x\) 这位一定会异或上 \(1\);
- \(x>lowbit(A_i)+lowbit(A_{i-1})\) 时,\(A_i\times A_{i-1}\) 的所有情况中 \(x\) 这位为 0/1 的概率相等。
原因:不妨设当前 \(A_i=s, A_{i-1}=t\),则 \(A_i\times A_{i-1} = st\bmod 2^m\)。
我们总是对应有一组 \(A'_i=(2^m-s), A'_j=t\),其 \(A'_i\times A'_{i-1} = -st \bmod 2^m\),也即与 \(st\) 在 lowbit 之上的更高位全部取反得到的数,此时这两组在 \(x\) 这一位上分别为 0/1。
合法性:\((A'_i, A'_{i-1})\) 显然也满足 lowbit 的限制;且由于有 \(x>lowbit(s)\),故 \(s\neq 2^{m-1}\) 即 \(A_i\neq A'_i\),满足这两对是不同的情况。
因此像这样一一对应地进行配对,最终我们得到的 0/1 概率就是相等的。
对于一个 \(x\),序列中只要出现一个位置 \(i\) 有第三种情况,那么这整个序列对于 \(x\) 的 \(p_1-p_0\) 就没有贡献,忽略它不影响最终对 \(p_1\) 的计算,因此不需要计算这种情况下的概率。
所以我们只需要考虑 \(lowbit(A_i)+lowbit(A_{i-1}) \ge x\) 的情况并计算这些情况下的 \(p_0, p_1\) 即可。
考虑从数列边缘拿掉一些东西。设 \(lowbit(A_2)=j\)。
-
若 \(j \le x\),则此时 \(lowbit(A_1)+lowbit(A_2) = x\) 和 \(lowbit(A_1)+lowbit(A_2) > x\) 的概率相等(都是钦定了 \(A_1\) 的第 \(x-j\) 位),均为 \(2^{-(x-j+1)}\)。因此这种情况下的 \(p_0, p_1\) 仍相等,不会有贡献。
-
若 \(j > x\),则此时 \(lowbit(A_1)+lowbit(A_2) > x\) 且 \(lowbit(A_2)+lowbit(A_3) > x\),删去序列开头的两个数不会有影响,变成了长度为 \(n-2\) 的子问题。
于是我们发现 只有所有偶数位置的 lowbit 都大于 \(x\) 的情况 才会有贡献,而此时 \(x\) 这一位一定为 \(0\)。所以最后答案就是(\(c=\lfloor \frac{n}{2} \rfloor\)):

浙公网安备 33010602011771号