计数杂谈(未填坑)
前言
1、本篇未提及的模数都是 \(p=998244353\)
概论
一般的组合类题目,我们都可以把最终的答案写成一个形似下面的式子
很多时候也简单写成
举个例子,比如说统计 \(1\) 到 \(n\) 内的奇数和,式子就是
其中,我们将 \(S\) 称为组合类, \(x\) 称为组合对象, \(f\) 称为权值函数。
构造双射
这是一个解决计数问题的基本思路。
有两种构造思路:
一种是把两个不同的组合类中的组合对象进行对应,这样子对这两个组合类做计数就是等价的了,比如说在原图上跑单点最短路计数,等价于在反图上跑其他点到单点的最短路计数。
另一种是同一组合类中的组合对象可以一一对应,然后就能对每一个小组单独询问然后乘上组数,比如说部分无向图上点对 \((i,j)\) 统计问题都是对称的,就可以只算 \(i\leq j\) 的情况然后乘 \(2\) 。
加乘原理
加法原理和乘法原理是基本工具。
加法原理
我们将 \(S\) 划分成 \(m\) 个不相交子集 \(S_i\) ,那么对 \(S\) 中所有元素求 \(f(x)\) 的和,等价于对 \(S_1,S_2,\cdots,S_m\) 求和后相加。
乘法原理
前言:笛卡尔积
我们可以将 \(S\) 拆分成 \(S_1,S_2,\cdots,S_m\) 的笛卡尔积,那么 \(S\) 中的的元素 \(x\) 对应的 \(f(x)\) 就等价于各个小集合 \(S_i\) 的\(f_i(x_i)\) 之积。
那么对 \(S\) 中的所有元素求和,等价于各个小集合 \(S_i\) 的\(f_i(x_i)\) 之积的和。
启示
我们可以看到,乘法原理告诉了我们可以在某些条件下调换 \(\sum\) 和 \(\prod\) 顺序,那我们也可以交换两个 \(\sum\) 的顺序。
当 \(B\) 的权值也就是 \(f\) 受到 \(x\) 的制约时,这玩意可堪一用。
例题
例题1 Rabbit Numbering
给定 \(n\) 个数,每个数的范围是 \([1,a_i]\) ,求所有数都不同的方案数。
我们考虑把这玩意的约束写的明白一点
- \(n\) 元正整数组 \((x_1,x_2,\cdots,x_n)\)
- \(x_i \leq a_i\)
- \(x_i\) 之间不相等
然后我们定义
那么答案就是
这个样子的式子是肯定没法搞的,所以我们考虑分离每一个 \(x\) ,又定义
之后,我们要求的式子就成了
我们不难发现,这里 \(S_i\) 的权值 \(f(x_1,x_2,\cdots,x_{i-1}|x_i)\) 受了 \(x1,x2,\cdots,x{i-1}\) 的限制,所以我们考虑交换求和顺序,来消除制约。
具体来看,我们按照 \(a_i\) 的大小作为求和顺序,\(a_i\) 越小越先求和,这样 \(x_i\) 就在与前 \(i-1\) 个数不等并且小于 \(a_i\) 的限制下,还剩 \(a_i-(i-1)\) 种合法值,并且与 \(x_1,x_2,\cdots,x_{i-1}\) 无关。
那么依据乘法原理,答案就是
这其实也是一个结论性的东西,以后可能会常用。
例题2 [AGC 023 E] Inversions
求 \(1,\ldots,n\) 的所有满足 \(p_i\leq a_i\)的排列 \(p_{1\ldots n}\) 的逆序对数总和。
神题咕了,研究明白了再说(
例题3 [THUPC2021 初赛] 区间矩阵乘法
我们先来看一个弱化版问题:给定矩阵 \(A_{m \times n}\) 和 \(B_{n \times r}\) 求 \(C = A \times B\) 的元素和。
我们可以交换求和顺序来解决。
那我们就发现枚举 \(j\) 之后求得是 \(A\) 的一列和 \(B\) 的一行,直接做就行了。
例题4 基环树拓扑序列计数
给定一棵包含 \(n\) 个节点的外向树,求其拓扑序列的个数
我们发现,基环树是很难处理那个环的,所以我们先把它当做一个有根树,便于预处理和推性质。
我们不妨发现一个性质:一个排列是拓扑序列的条件是它的每个点在其子树中最早出现
这个性质的正确性是显然的,那么怎么求呢?
我们设这个子树 \(u\) 的大小是 \(size_u\) ,那么总序列数就是 \(n!\) ,每个子树中 \(u\) 最早出现的 概率 是 \(\frac{1}{size_u}\)
那么精彩的就来了,我们可以直接乘进去,因为我们考虑了全部的序列,就可以理解为一个巨大的样本库,就可以直接把概率乘进去,虽然没啥道理,但是正确性还挺对的,感觉算个 \(trick\) ,可堪一用。
因为子树间是独立的,所以答案就是
二项式系数,容斥原理
组合数概念
我们定义,组合数 \(\dbinom{n}{m}\) 为从 \(n\) 个不同物品里挑出 \(m\) 个物品形成集合的方案数,其中要求 \(n \geq m\) , \(n,m\) 为自然数。
假若 \(n<m\) ,那么 \(\dbinom{n}{m}=0\) 。
其中 , $ \dbinom{n}{m} = \frac{A_{n}^{m}}{m!} = \frac{n!}{m!(n-m)!} $ ,这就是基本的运算公式。
二项式定理
所以组合数往往也被称之为 二项式系数 。
一些性质
以上是一些非常基本的式子,证明也非常简单,下面会给出一些不太显然的性质。
这两个式子可以直接展开证明。
这个式子本质上就是第二个式子的一个推导。
上指标求和: $ \sum\limits_{i=0}^{n} \dbinom{i}{m} = \dbinom{n+1}{m+1} $
对角线求和 : $ \sum\limits_{i=0}^{n} \dbinom{m+i}{i} = \dbinom{m+n+1}{n} $
范德蒙德卷积 : $ \sum\limits_{i=0}^{k} \dbinom{n}{i} \dbinom{m}{k-i} = \dbinom{n+m}{k} $
范德蒙德卷积的另一种形式: $\sum\limits_{i=0}^{min(n,m-k)} \dbinom{n}{i} \dbinom{m}{i+k} = \dbinom{n+k}{m+k} $
平方求和 : $\sum\limits_{i=0}^{n} \dbinom{n}{i}^2 = \dbinom{2n}{n} $
广义二项式系数
我们可以将二项式系数的上标 \(n\) 拓展到实数域,但是下标 \(m\) 还得是自然数。
广义二项式系数 : \(\dbinom{n}{m} = \frac{n(n-1) \cdots (n-m+1)}{m!}\)
广义二项式定理 : \((1+x)^\alpha = \sum\limits_{i=0}^{+ \infty} \dbinom{\alpha}{i} x^i \qquad ((1+x) \in [-1,1])\)
上指标反转: $ \dbinom{n}{m} = \dbinom{m-n-1}{m} \times (-1)^m $
多项式系数
我们换一种拓展思路,看看下标 \(m\) 有没有什么可以拓展的。
首先引入一个问题: \(n\) 个元素划分至 \(m\) 个集合里,第 \(i\) 个集合大小为 \(a_i\) ,有 \(\sum a_i = n\) ,求划分方案数。
我们把这个问题称之为 多重组合问题 ,记这样的问题答案为 \(\dbinom{n}{a_1,a_2,\cdots,a_m}\) 。
那么我们每个集合依次确定取哪些元素,就能得到 $$ \dbinom{n}{a_1,a_2,\cdots,a_m} = \prod\limits_{i=1}^{m} \dbinom{a_1+a_2+\cdots+a_m}{a_i} = \prod\limits_{i=1}^{m} \frac{(a_1+a_2+\cdots+a_m)!}{a_i ! \times (a_{i+1},a_{i+2},\cdots,a_m} = \frac{n!}{a_1 ! a_2 ! \cdots a_m !} $$
那么就有多项式定理
证明也是用组合意义去考虑,但是证明没啥价值。
基本应用——十二重计数法
咕咕咕
求组合数
情况一 :给定一个 \(n\) ,求出所有的 \(\dbinom{i}{j} (1 \leq i,j \leq n)\)
因为要求出所有的 \(\dbinom{i}{j}\) 所以我们利用递推式 \(\dbinom{i}{j} = \dbinom{i-1}{j} + \dbinom{i-1}{j-1}\) ,进行递推。
时间复杂度 \(O(n^2)\)
情况二 :给定一个 \(q\),在 \(q\) 次询问里每次查询 \(\dbinom{a}{b}\) ,模数是大于 \(n\) 的质数。
预处理出来 \(n! \; mod \; p\) 和 \(\frac{1}{n!} \; mod \; p\) ,之后带入公式直接算,复杂度 \(O(n+q)\)
还可以直接暴力计算 \(\frac{a \times (a-1) \times (a-2) \times \cdots \times (a-b+1)}{b!}\) ,复杂度是 \(O(\sum b)\) 的。
如果递推计算 \(\dbinom{n}{0},\dbinom{n}{1},\cdots,\dbinom{n}{m}\) 的复杂度是 \(O(m)\) 的,比较优秀。