组合计数大学习

钦定:考虑选 $ i $ 个条件,且只考虑这 $ i $ 个条件,即与剩下的东西选不选无关。

恰好:考虑选 $ i $ 个条件,且剩下的 $ n-i $ 个条件一定不选。

令 $ f_i $ 表示钦定,$ g_i $ 表示恰好,则有二项式反演:

\[f_i = \sum\limits_{j=i}^{n} \dbinom{j}{i} g_j \iff g_i = \sum\limits_{j=i}^{n} (-1)^{j-i} \dbinom{j}{i} f_j \\ f_n = \sum\limits_{i=0}^{n} \dbinom{n}{i} g_i \iff g_n = \sum\limits_{i=0}^{n} (-1)^{n-i} \dbinom{n}{i} f_i \]

AT_arc121_e [ARC121E] Directed Tree

首先看到恰好满足 $ n $ 个条件,考虑容斥,设 $ f_i $ 表示钦定不满足 $ i $ 个条件的方案数。

条件形如:$ a_i $ 是 $ i $ 的祖先不成立,难以刻画。

注意到 $ a $ 需要是个排列,那么考虑它的逆排列 $ b $,则条件转化为 $ b_i $ 不在 $ i $ 的子树中。

这样就比较好做了,直接设 $ f_{u,j} $ 表示以 $ u $ 为根的子树中,有 $ j $ 个不满足条件的。

首先由于子树间互不影响,所以可以像树上背包一样合并:$ f_{u,j+k} = f_{u,j} \times f_{v,k} $。

合并完之后单独考虑 $ u $ 这个结点的贡献:$ f_{u,i} = f_{u,i-1} \times ((siz_u - 1) - (i-1) ) $。

意义为对于 $ u $ 这个结点,它可以选的点本来是 $ siz_u - 1 $ 个,现在已经选了 $ i-1 $ 个要减去。

这样即可求出 $ f_i = f_{1,i} $ 表示钦定不满足 $ i $ 个条件的方案数。

那么总方案数 $ g_n = \sum\limits_{i=0}^{n} (-1)^i f_i $。

AT_abc266_g [ABC266G] Yet Another RGB Sequence

看到恰好考虑转为钦定。

设 $ f_i $ 表示钦定选了 $ i $ 个 $ rg $ 的方案数。

显然可以二项式反演直接求出恰好的方案数。

考虑 $ f_i $ 怎么算。

可以直接组合数算,$ f_i = \dbinom{n-i}{i} \dbinom{n-i\times 2}{r-i} \dbinom{n-i\times 2 - (r-i)}{g-i} $,根据组合意义显然。

P6478 [NOI Online #2 提高组] 游戏

写下简化题意:$ 2m $ 个点的树上有 $ m $ 个黑点,$ m $ 个白点,现在对于每个 $ k $ 要求出有多少个两两匹配的方案。

和第一题差不多,首先还是恰好转钦定。

然后考虑树形 DP,设 $ f_{u,i} $ 表示 $ u $ 子树中配对了 $ i $ 个的方案数,剩下的和第一个基本一样。

P8329 [ZJOI2022] 树

困困难难咕咕咕 \(\cdots\)

P4609 [FJOI2016] 建筑师

第一类斯特林数!!!

$ \begin{bmatrix} n \ m \end{bmatrix} $ 表示将 $ n $ 划分成 $ m $ 个非空圆排列\轮换的方案数。

显然有递推式 $ \begin{bmatrix} n \ m \end{bmatrix} = \begin{bmatrix} n-1 \ m-1 \end{bmatrix} + (n-1) \begin{bmatrix} n \ m-1 \end{bmatrix} $。

意义就是可以把新加的一个元素新开一个轮换,也可以放进原来的里面,可以插入到任意一个轮换的任意一个数后面,所以乘上系数 $ (n-1) $。

排列与轮换一一对应,所以 $ n! = \sum\limits_{i=1}^{n} \begin{bmatrix} n \ i \end{bmatrix} $。

来考虑这题,你给整个序列的数值用柱状图画出来,你注意到最高的那个柱子将整个序列划分成了两部分,左边是前缀最大值,右边是后缀最大值。

这个时候前后缀无关了,所以我们现在来考虑前缀最大值。

显然的 $ A $ 前缀最大值将整个前缀划分成了 $ A-1 $ 个连续的区间,让我们对这些区间来考虑。

对于一个区间,我们和它前面的一个前缀最大值绑在一起,然后观察这个区间的方案数。

显然,整个区间只有一个最大值的位置是固定的,剩余的随便放即可,设这个区间的长度为 $ len $,那么这个区间的方案数即为 $ (len-1)! $。

继续观察一下这个东西,长度为 $ len $,方案数为 $ (len-1)! $,这是什么?这是圆排列方案数!!!

欸,那么你想一下,将整个前缀划分成 $ A-1 $ 个区间是不是就代表将前缀 $ len $ 划分成 $ A-1 $ 个圆排列呢!!!

所以你设 $ n $ 的位置是 $ m $ 的话,整个序列的答案即为:$ \begin{bmatrix} m-1 \ A-1 \end{bmatrix} \times \begin{bmatrix} n-m \ B-1 \end{bmatrix} $。

但是由于数据 $ T \le 2e5,n \le 2e5 $ 你显然是不可以枚举这个 $ m $ 的,所以考虑继续化简。

你发现事实上无需将前后缀分开计算,你直接给整个序列 $ n-1 $ 个数划分成 $ A-1+B-1 $ 个轮换,然后再放在最大值两边,这个东西是和上面完全等价的!!!

所以答案就可以写作:$ \begin{bmatrix} n-1 \ A+B-2 \end{bmatrix} \times \dbinom{A+B-2}{A-1} $。

P6620 [省选联考 2020 A 卷] 组合数问题

第二类斯特林数!!!!!

q1uple 讲课的时候已经学过了,这里贺点东西过来。

第二类斯特林数递推式:

\[\begin{Bmatrix} n \\m \end{Bmatrix} = \begin{Bmatrix} {n-1} \\{m-1} \end{Bmatrix} + m\begin{Bmatrix} {n-1} \\{m} \end{Bmatrix} \]

证明就是考虑其组合意义,将 $ n $ 个数划分成 $ m $ 个集合的方案数。现在要新加入一个数,那么就是要么这个数单开一个集合,要么这个数放在原来的集合中的任意一个。

第二类斯特林数重要公式:

\[m^n = \sum\limits_{i=0}^{m} \begin{Bmatrix} {n} \\{i} \end{Bmatrix} i! {\dbinom{m}{i}} = \sum\limits_{i=0}^{m} \begin{Bmatrix} {n} \\{i} \end{Bmatrix} m^{\underline{i}} \]

证明还是考虑组合意义,左边的组合意义显然为 $ n $ 个不相同的球放进 $ m $ 个不相同的盒子中的方案数。

第二类斯特林数在球与盒子上的定义是:$ n $ 个不相同的球放进 $ m $ 个相同的盒子中,且不能有盒子为空的方案数。

后面的意思就是考虑直接枚举有多少个非空的盒子,第二类斯特林数乘上阶乘变成不相同的盒子,组合数选用哪些盒子。

这些都是之前学的了,今天学了很聪明的东西,下降幂。

下降幂有个很优美的性质,$ \dbinom{n}{k} k^{\underline m} = \dbinom{n-m}{n-k} n^{\underline m} $。

要证明的话就是你直接给两个拆成阶乘然后化化化即可。

然后来做下这题:

\[\sum\limits_{k=0}^{n} f(k) \times x^k \times \dbinom{n}{k} \]

这题没说模数一定是质数,也就是不一定有逆元,那也就是组合数大概率是算不了的。

组合数要消掉那差不多能想到的就是只有用二项式定理?

所以化式子的时候要往那方面去想。

\[= \sum\limits_{k=0}^{n} \sum\limits_{i=0}^{m} a_i \times k^i \times x^k \times \dbinom{n}{k} \]

考虑将普通幂转下降幂,令 $ f(k) $ 的下降幂多项式为 $ \sum\limits_{i=0}^{m} b_i k^{\underline i} $。

\[\begin{aligned} = \sum\limits_{k=0}^{n} \sum\limits_{i=0}^{m} b_i \times k^{\underline i} \times x^k \times \dbinom{n}{k} \\ = \sum\limits_{k=0}^{n} \sum\limits_{i=0}^{m} b_i \times n^{\underline i} \times x^k \times \dbinom{n-k}{k-i} \\ = \sum\limits_{i=0}^{m} b_i n^{\underline i} \sum\limits_{k=0}^{n} \dbinom{n-i}{k-i} x^k \\ = \sum\limits_{i=0}^{m} b_i n^{\underline i} \sum\limits_{k=0}^{n-i} \dbinom{n-i}{k} x^k \\ = \sum\limits_{i=0}^{m} b_i n^{\underline i} (x+1)^{n-i} \end{aligned} \]

然后问题就转化为了如何去求 $ b_i $,写下式子。

\[\sum\limits_{i=0}^{m} a_i k^i \]

直接利用第二类斯特林数普通幂转下降幂。

\[= \sum\limits_{i=0}^{m} a_i \sum\limits_{j=0}^{k} \begin{Bmatrix} i \\ j \end{Bmatrix} k^{\underline j} \]

直接交换求和顺序即可得到:

\[=\sum\limits_{j=0}^{m} k^{\underline j} \sum\limits_{i=j}^{m} a_i \begin{Bmatrix} i \\ j \end{Bmatrix} \]

即 $ b_j = \sum\limits_{i=j}^{m} a_i \begin{Bmatrix} i \ j \end{Bmatrix} $,直接第二类斯特林数递推即可 $ O(m^2) $ 求出。

CF1278F Cards

感觉要是把式子写出来了就不太难。

首先有答案式子:$ \sum\limits_{x=0}^{n} \dbinom{n}{x} p^x (1-p)^{n-x} x^k $。

具体意义就是你枚举选了多少个,组合数算选了哪些,$ p $ 是单次选的概率,$ x^k $ 是期望的贡献。

然后看到 $ x^k $ 直接套路地拆成第二类斯特林数的形式:$ x^k = \sum\limits_{i=0}^{x} \begin{Bmatrix} k \ i \end{Bmatrix} i! \dbinom{x}{i} $。

后面是 dirty work。

P3175 [HAOI2015] 按位或

$ \min - \max $ 容斥!!!

$ \min-\max $ 容斥可以解决已知一个集合容易求出最小/最大值,不容易求出最大/最小值的时候一直一个求出另外一个的问题。

令 $ \min(S) $ 表示集合 $ S $ 的最小值,$ \max(S) $ 表示集合 $ S $ 的最大值,那么有公式:

\[\min(S) = \sum\limits_{T \subset S} \max(T) \times (-1)^{|T|+1} \\ \max(S) = \sum\limits_{T \subset S} \min(T) \times (-1)^{|T|+1} \]

这个东西在期望下仍然成立,即:

\[E(\min(S)) = \sum\limits_{T \subset S} E(\max(T)) \times (-1)^{|T|+1} \\ E(\max(S)) = \sum\limits_{T \subset S} E(\min(T)) \times (-1)^{|T|+1} \]

来看这题。

不妨令 \(\max(S)\) 表示 \(S\) 集合全部变成 \(1\) 的时间,也就是最大时间,\(\min(S)\) 表示 \(S\) 集合有一个变成 \(1\) 的时间,也就是最小时间。我们需要求的就是 \(E(\max(U))\),根据 \(\min-\max\) 容斥,有:

\[E(max(U)) = \sum\limits_{T \subset U} E(\min(T)) \times (-1)^{|T|+1} \]

现在问题转化为了求对于每个集合 $ S $ 求出 $ E(\min(S)) $。

你可以直接写出这个期望的式子:$ E(\min(S)) = \sum\limits_{i=1}^{+\infty} i P(\min(S)=i) $。

后面这个 $ P(\min(S)=i) $ 表示这个第一次出现的时间恰好为 $ i $ 的概率。

考虑这个怎么算。

这个第一次出现的时间要刚好在 $ i $ 时刻,也就是说在前 $ i-1 $ 都没有出现过,概率为 $ (\sum\limits_{T \cap S = \varnothing} P(T))^{i-1} $。

$ P(T) $ 表示 $ T $ 集合出现的概率,这是个子集和的形式。

然后一定要在 $ i $ 时刻出现,所以 $ i $ 时刻出现了,即 $ 1-\sum\limits_{T \cap S = \varnothing} P(T) $。

两个乘起来就是 $ P(\min(S)=i) $ 的答案。

然后你带进 $ E(\min(S)) $ 的式子化化化可以就得到 $ E(\min(S)) = \dfrac{1}{1-\sum\limits_{T \cap S = \varnothing} P(T)} $。

注意到这里有个子集和,在数据范围下只能 $ FWT $ 计算。

这题就做完了,复杂度是 $ FWT $ 的复杂度。

UOJ424 [集训队作业2018] count

反射容斥!!!

之前学过一会了,现在来看好像也不是很难?

主要思想就是在格路计数只有一条线的时候从 $ (0,0) $ 到 $ (n,n) $ 经过那条线的路径与将起始点关于那条线对称之后的点到 $ (n,n) $ 的路径构成双射。

一条线是这个,然后两条线的情况就是容斥,设两条线分别是 $ A $ 线和 $ B $ 线,然后你的路径显然是可以划分成一个个等价类,每个等价类形如 $ ABABA $ 这样 $ AB $ 交替的形式,表示这条路径经过了哪些线以及分别经过了几次。

这样就可以容斥计算了,方案数为:无限制方案数 - 碰了 \(A\) 线的方案数 - 碰了 \(B\) 线的方案数 + 先碰了 \(A\) 线再碰了 \(B\) 线的方案数 + 先碰了 \(B\) 线再碰了 \(A\) 线的方案数 \(\cdots\)

这种碰了 $ A $ 线又碰了 $ B $ 线事实上也有构成双射的路径,即将出发点按 $ AB $ 交替顺序对称数次之后的点到终点的方案数。

要注意的是这种方法仅适用于直线斜率 $ k=1 $ 的情况,当 $ k \not = 1 $ 的情况叫做 Dyck 路径,以后再来补。

来看这题。

注意到和序列最大值有关,所以考虑笛卡尔树。

两个序列同构等价于这两个序列建出来的笛卡尔树同构。

值域限定为 $ [1,m] $,也就是说限定建出来的这棵笛卡尔树的最长左链长度至多为 $ m $。

拿括号序刻画一下,在笛卡尔树上从根节点开始,向左走表示左括号,回溯表示右括号,那么也就是说整个括号序在用栈模拟匹配的时候,栈中左括号数不能大于 $ m $。

放在格路计数上考虑就是从 $ (0,0) $ 结点开始走到 $ (n,n) $ 不能碰到直线 $ y=x+m+1 $。

由于左链长度肯定不能为负数,所以也不能碰到直线 $ y=x-1 $。

问题这下就转化为了从 $ (0,0) $ 走到 $ (n,n) $ 不能碰到直线 $ y=x+m+1 $ 和 $ y=x-1 $,问你方案数。

反射容斥板子,直接做即可。

P5825 排列计数

欧拉数!!!

其实讲师根本没讲欧拉数,写一下讲师的神秘容斥做法。

首先你注意到让你求恰好 $ k $ 个,于是你直接二项式反演转成钦定 $ k $ 个位置有升高。

有 $ k $ 个位置升高也就是说你用 $ k $ 个 $ < $ 合并了 $ k $ 个相邻的段,将整个序列划分成了 $ n-k $ 个连续段,每个连续段内都必须递增。

问题转化为将 $ n $ 个不同的数放进 $ n-k $ 个有标号集合,每个集合不为空的方案数。

注意到这个不为空的条件不好做,所以你再容斥一遍,转化为钦定 $ m $ 个集合为空,剩下的随便放的方案数。

这个显然是好做的,方案数为 $ (n-k-m)^{n} $ 个。

然后直接二项式反演即可求出 $ f(k) $ 即将 $ n $ 个不同的数放进 \(k\) 个有标号集合,每个集合不为空的方案数。

\[f(k) = \sum\limits_{i=0}^{k} \dbinom{k}{i} (-1)^i (k-i)^n \]

然后你再二项式反演就可以求出答案。

这两个二项式反演都可以写成卷积的形式,可以 poly 优化。

P10004 [集训队互测 2023] Permutation Counting 2

上题的二维版本。

首先有两个恰好,你还是给它转成钦定,令 $ f(a,b) $ 表示钦定在原排列上钦定了 $ a $ 个上升,在逆排列上钦定了 $ b $ 个上升。

我们现在挖掘一点这个东西的性质。

你考虑一下钦定在原排列上有 $ a $ 个上升,在逆排列上有 $ b $ 个上升,那么如何刻画这个东西。

先给这玩意画个图,横轴表示原排列,纵轴表示逆排列。

img

如图,你考虑一下这个图上的数字可以怎么填?

对于纵轴上面的一个连续段来说,它在填的时候一定是要按在横轴上的大小从小到大填的,因为这是上升段的定义。

对于横轴上面的一个连续段来说,也是同理,它在填的时候一定是要按在纵轴上的大小从小到大填的。

那么我们可以注意到一个事情,在我们用 $ a $ 个横上升段和 $ b $ 个纵上升段组成一个 $ a\times b $ 的矩阵之后,当我们确定了这个矩阵的一个格子中填了几个数之后,这几个数在原排列上如何排列我们是可以确定的。

换句话讲,整个 $ a \times b $ 矩阵的填数方案与 $ f(a,b) $ 的方案构成双射!!!

看一下这个矩阵的填数方案有什么限制?

显然连续段的长度不为零,且整个矩阵一共填了 $ n $ 个数。

也就是说我要求的就是:将 $ n $ 个数放进 $ a \times b $ 的矩阵,整个矩阵不存在值全为零的一行或一列的方案数。

这个东西还是可以容斥求。

先钦定横轴有几个零,再在此基础上钦定纵轴有几个零,使用两次容斥即可。

现在求出来了 $ f(a,b) $,那么你再两次二项式反演即可求出答案。

P3349 [ZJOI2016] 小星星

子集反演!!!

其实是和二项式反演差不多的感觉?

设 $ f(S) $ 表示当集合的限制恰好为 $ S $ 时的答案,$ g(S) $ 表示当集合的限制钦定为 $ S $ 时的答案。

\[g(S) = \sum\limits_{T \subset S} f(T) \iff f(S) = \sum\limits_{T \subset S} (-1)^{|S| - |T|} g(T) \\ g(S) = \sum\limits_{S \subset T} f(T) \iff f(S) = \sum\limits_{S \subset T} (-1)^{|T| - |S|} g(T) \]

两种形式一个是子集,一个是超集。

来看这题。

首先有一个 $ O(3^n \times n^3) $ 的树形 DP,设 $ f_{i,j,S} $ 表示在 $ i $ 子树内的点集为 $ S $,且将 $ i $ 对应为图上的编号 $ j $ 的方案数,直接 DP 即可,但是显然过不了。

注意到复杂度瓶颈在于这个 DP 数组枚举子集,考虑给这个东西搞掉。

想一下不记录这个 $ S $ 会造成什么影响?

不能保证答案是个排列。

那么其实不一定要 $ S $ 来保证是个排列,其实还可以容斥!!!

直接对于 \(S\) 的每一个子集求一遍答案然后直接子集反演即可!!!

posted @ 2026-02-06 21:43  LittleFoxFairy  阅读(31)  评论(0)    收藏  举报