计数杂谈(未填坑)

前言

1、本篇未提及的模数都是 \(p=998244353\)

概论

一般的组合类题目,我们都可以把最终的答案写成一个形似下面的式子

\[\sum\limits_{x\in S} f(x)[P(x)] \]

很多时候也简单写成

\[\sum\limits_{x\in S} f(x) \]

举个例子,比如说统计 \(1\)\(n\) 内的奇数和,式子就是

\[S= \{1,2,\cdot\cdots\cdots,n\} \]

\[f(x)=x \]

\[P(x)=\,x \equiv 1\! \pmod{2} \]

其中,我们将 \(S\) 称为组合类, \(x\) 称为组合对象, \(f\) 称为权值函数

构造双射

这是一个解决计数问题的基本思路。

有两种构造思路:

一种是把两个不同的组合类中的组合对象进行对应,这样子对这两个组合类做计数就是等价的了,比如说在原图上跑单点最短路计数,等价于在反图上跑其他点到单点的最短路计数。

另一种是同一组合类中的组合对象可以一一对应,然后就能对每一个小组单独询问然后乘上组数,比如说部分无向图上点对 \((i,j)\) 统计问题都是对称的,就可以只算 \(i\leq j\) 的情况然后乘 \(2\)

加乘原理

加法原理和乘法原理是基本工具。

加法原理

我们将 \(S\) 划分成 \(m\) 个不相交子集 \(S_i\) ,那么对 \(S\) 中所有元素求 \(f(x)\) 的和,等价于对 \(S_1,S_2,\cdots,S_m\) 求和后相加。

\[\sum\limits_{x \in S} f(x) = \sum\limits_{i=1}^m (\sum\limits_{x \in S_i} f(x)) \quad ( \biguplus\limits_{i=1}^m S_i = S ) \]

乘法原理

前言:笛卡尔积

我们可以将 \(S\) 拆分成 \(S_1,S_2,\cdots,S_m\) 的笛卡尔积,那么 \(S\) 中的的元素 \(x\) 对应的 \(f(x)\) 就等价于各个小集合 \(S_i\)\(f_i(x_i)\) 之积。

\[f(x) = \prod\limits_{x_i\in S_i} f_i(x_i) \quad ( S_1 \times S_2 \times S_3 \times \cdots \times S_m = S ) \]

那么对 \(S\) 中的所有元素求和,等价于各个小集合 \(S_i\)\(f_i(x_i)\) 之积的和。

\[\sum\limits_{x \in S} f(x) = \prod\limits_{i=1}^m (\sum\limits_{x_i\in S_i} f_i(x_i)) \quad ( S_1 \times S_2 \times S_3 \times \cdots \times S_m = S ) \]

启示

我们可以看到,乘法原理告诉了我们可以在某些条件下调换 \(\sum\)\(\prod\) 顺序,那我们也可以交换两个 \(\sum\) 的顺序。

\[\sum\limits_{x\in A}\sum\limits_{y \in B} f(x,y) =\sum\limits_{y \in B}\sum\limits_{x \in A} f(x,y) \]

\(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\) 之间不相等

然后我们定义

\[S_i = \{1,2,\cdots,a_i \} \]

\[f(x_1,x_2,\cdots,x_n) = [x_1 \neq x_2] \times [x_1 \neq x_3] \times \cdots \times [x_1 \neq x_n] \times [x_2 \neq x_1] \times \cdots \times [x_{n-1} \neq x_n] \]

那么答案就是

\[\sum\limits_{x_1 \in S_1} \sum\limits_{x_2 \in S_2} \cdots \sum\limits_{x_n \in S_n} f(x_1,x_2,\cdots,x_n) \]

这个样子的式子是肯定没法搞的,所以我们考虑分离每一个 \(x\) ,又定义

\[f(x_1,x_2,\cdots,x_{n-1}|x_n)=[x_n \neq x_1] \times [x_n \neq x_2] \times \cdots \times [x_n \neq x_{n-1}] \]

之后,我们要求的式子就成了

\[\sum\limits_{x_1 \in S_1} f(x_1) \sum\limits_{x_2 \in S_2} f(x_1|x_2) \cdots \sum\limits_{x_n \in S_n} f(x_1,x_2,x_3,\cdots,x_{n-1}|x_n) \]

我们不难发现,这里 \(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}\) 无关。

那么依据乘法原理,答案就是

\[\prod\limits_{i=1}^n (\sum\limits_{x_i\in S_i} f_i(x_i) = \prod\limits_{i=1}^n (a_i-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\) 的元素和。

我们可以交换求和顺序来解决。

\[\sum\limits_{i=0}^{m-1} \sum\limits_{j=0}^{n-1} \sum\limits_{k=0}^{r-1} A_{i,j} B_{j,k} =\sum\limits_{j=0}^{n-1} (\sum\limits_{i=0}^{m-1} A_{i,j})(\sum\limits_{k=0}^{r-1} B_{j,k}) \]

那我们就发现枚举 \(j\) 之后求得是 \(A\) 的一列和 \(B\) 的一行,直接做就行了。


例题4 基环树拓扑序列计数
给定一棵包含 \(n\) 个节点的外向树,求其拓扑序列的个数

我们发现,基环树是很难处理那个环的,所以我们先把它当做一个有根树,便于预处理和推性质。

我们不妨发现一个性质:一个排列是拓扑序列的条件是它的每个点在其子树中最早出现

这个性质的正确性是显然的,那么怎么求呢?

我们设这个子树 \(u\) 的大小是 \(size_u\) ,那么总序列数就是 \(n!\) ,每个子树中 \(u\) 最早出现的 概率\(\frac{1}{size_u}\)

那么精彩的就来了,我们可以直接乘进去,因为我们考虑了全部的序列,就可以理解为一个巨大的样本库,就可以直接把概率乘进去,虽然没啥道理,但是正确性还挺对的,感觉算个 \(trick\) ,可堪一用。

因为子树间是独立的,所以答案就是

\[n! \times \prod\limits_{i=1}^{n} \frac{1}{size_i} \]

二项式系数,容斥原理

组合数概念

我们定义,组合数 \(\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)!} $ ,这就是基本的运算公式。

二项式定理

\[(1+x)^n = \sum\limits_{i=0}^{n} \dbinom{n}{i}x^i \]

所以组合数往往也被称之为 二项式系数

一些性质

\[\dbinom{n}{0}=1 , \dbinom{n}{1}=n , \dbinom{n}{2}= \frac{n \times (n-1)}{2} \]

\[\dbinom{n}{m} = \dbinom{n}{n-m} \]

\[\dbinom{n}{m} = \dbinom{n-1}{m-1} + \dbinom{n-1}{m} \]

\[\sum\limits_{i=0}^{n} \dbinom{n}{i} = 2^n \]

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

以上是一些非常基本的式子,证明也非常简单,下面会给出一些不太显然的性质。

\[(n-m) \times \dbinom{n}{m} = n \times \dbinom{n-1}{m} \]

\[m \times \dbinom{n}{m} = n \times \dbinom {n-1}{m-1} \]

这两个式子可以直接展开证明。

\[\sum\limits_{i=0}^{n} \times \dbinom{n}{m} = n \times 2^{n-1} \]

这个式子本质上就是第二个式子的一个推导。

上指标求和: $ \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 !} $$

那么就有多项式定理

\[(\sum\limits_{i=0}^m a_i )^n = \sum\limits_{\sum\limits_{i=1}^{m} a_i = n} \dbinom{n}{a_1,a_2,\cdots,a_m} \prod\limits_{i=1}^{m} x_i \]

证明也是用组合意义去考虑,但是证明没啥价值。

基本应用——十二重计数法

咕咕咕

求组合数

情况一 :给定一个 \(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)\) 的,比较优秀。

posted @ 2022-07-30 15:16  sky_light  阅读(46)  评论(0编辑  收藏  举报