组合计数大学习
钦定:考虑选 $ i $ 个条件,且只考虑这 $ i $ 个条件,即与剩下的东西选不选无关。
恰好:考虑选 $ i $ 个条件,且剩下的 $ n-i $ 个条件一定不选。
令 $ f_i $ 表示钦定,$ g_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 讲课的时候已经学过了,这里贺点东西过来。
第二类斯特林数递推式:
证明就是考虑其组合意义,将 $ n $ 个数划分成 $ m $ 个集合的方案数。现在要新加入一个数,那么就是要么这个数单开一个集合,要么这个数放在原来的集合中的任意一个。
第二类斯特林数重要公式:
证明还是考虑组合意义,左边的组合意义显然为 $ n $ 个不相同的球放进 $ m $ 个不相同的盒子中的方案数。
第二类斯特林数在球与盒子上的定义是:$ n $ 个不相同的球放进 $ m $ 个相同的盒子中,且不能有盒子为空的方案数。
后面的意思就是考虑直接枚举有多少个非空的盒子,第二类斯特林数乘上阶乘变成不相同的盒子,组合数选用哪些盒子。
这些都是之前学的了,今天学了很聪明的东西,下降幂。
下降幂有个很优美的性质,$ \dbinom{n}{k} k^{\underline m} = \dbinom{n-m}{n-k} n^{\underline m} $。
要证明的话就是你直接给两个拆成阶乘然后化化化即可。
然后来做下这题:
这题没说模数一定是质数,也就是不一定有逆元,那也就是组合数大概率是算不了的。
组合数要消掉那差不多能想到的就是只有用二项式定理?
所以化式子的时候要往那方面去想。
考虑将普通幂转下降幂,令 $ f(k) $ 的下降幂多项式为 $ \sum\limits_{i=0}^{m} b_i k^{\underline i} $。
然后问题就转化为了如何去求 $ b_i $,写下式子。
直接利用第二类斯特林数普通幂转下降幂。
直接交换求和顺序即可得到:
即 $ 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 $ 的最大值,那么有公式:
这个东西在期望下仍然成立,即:
来看这题。
不妨令 \(\max(S)\) 表示 \(S\) 集合全部变成 \(1\) 的时间,也就是最大时间,\(\min(S)\) 表示 \(S\) 集合有一个变成 \(1\) 的时间,也就是最小时间。我们需要求的就是 \(E(\max(U))\),根据 \(\min-\max\) 容斥,有:
现在问题转化为了求对于每个集合 $ 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\) 个有标号集合,每个集合不为空的方案数。
然后你再二项式反演就可以求出答案。
这两个二项式反演都可以写成卷积的形式,可以 poly 优化。
P10004 [集训队互测 2023] Permutation Counting 2
上题的二维版本。
首先有两个恰好,你还是给它转成钦定,令 $ f(a,b) $ 表示钦定在原排列上钦定了 $ a $ 个上升,在逆排列上钦定了 $ b $ 个上升。
我们现在挖掘一点这个东西的性质。
你考虑一下钦定在原排列上有 $ a $ 个上升,在逆排列上有 $ b $ 个上升,那么如何刻画这个东西。
先给这玩意画个图,横轴表示原排列,纵轴表示逆排列。

如图,你考虑一下这个图上的数字可以怎么填?
对于纵轴上面的一个连续段来说,它在填的时候一定是要按在横轴上的大小从小到大填的,因为这是上升段的定义。
对于横轴上面的一个连续段来说,也是同理,它在填的时候一定是要按在纵轴上的大小从小到大填的。
那么我们可以注意到一个事情,在我们用 $ 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 $ 时的答案。
两种形式一个是子集,一个是超集。
来看这题。
首先有一个 $ O(3^n \times n^3) $ 的树形 DP,设 $ f_{i,j,S} $ 表示在 $ i $ 子树内的点集为 $ S $,且将 $ i $ 对应为图上的编号 $ j $ 的方案数,直接 DP 即可,但是显然过不了。
注意到复杂度瓶颈在于这个 DP 数组枚举子集,考虑给这个东西搞掉。
想一下不记录这个 $ S $ 会造成什么影响?
不能保证答案是个排列。
那么其实不一定要 $ S $ 来保证是个排列,其实还可以容斥!!!
直接对于 \(S\) 的每一个子集求一遍答案然后直接子集反演即可!!!

浙公网安备 33010602011771号