到处都能见到它的身影,它是一切数数题的基础。
概念基础
基本定义与一些常见公式与方法。
排列数
从 n 个不同元素中,任取 m(m⩽n)个元素按照一定的顺序排成一列,方案个数记作 Anm,有 Anm=(n−m)!n!。
一个有限集合 S 到自身的双射称为 S 的一个置换,集合 S=a1,⋯,an 的置换可以表示为:
f=(a1,a2,…,anap1,ap2,…,apn)
是将 ai 映射为 api,这样 p 是 1⋯n 的一个排列,S 上的所有置换的数量为 n!。
置换的过程可以使用有向图来理解,连边 i→pi,就是所有点移动 1 的距离。置换中形成一个环的称为置换环,对于大小为 1,2 的置换环,原排列和置换显然是一样的。
对于两个置换 f,g 的乘积记作 f∘g,代表先通过 f 的映射,再通过 g 的映射。
一个排列中的逆序对个数,也叫做反序数,如果是偶数就是偶排列,奇数则是奇排列。
对于一个排列 1,⋯,n,如果将任意两个数 i,j 交换,其它数保持不动,就会得到一个新的排列,那么这样一个变换叫做对换,用 (i,j) 表示。
组合数
从 n 个不同元素中,任取 m(m⩽n)个元素按照任意的顺序组成一个集合,方案个数记作 (mn)。组合数同时也是二项式系数,当 m<0 时,组合数没有定义。
(mn)=(n−m)!m!n!=m!nm(mn)=(mn−1)+(m−1n−1)
组合数有以下性质 / 恒等式:
- (mn)=(n−mn);
- (kn)=kn−k+1(k−1n),常被用来递推组合数;
- (rn)(kr)=(kn)(r−kn−k);
- 吸收恒等式:(kr)=kr(k−1r−1),当二项式外有一个无用的系数时,我们可以将它“吸收”进二项式系数。
- 下指标求和(行求和):i=0∑n(in)=2n,相当于是二项式定理中 a=b=1。注意这个东西是很特殊的完整一行,一般的行求和是无法快速计算的。它还有变式:
- i=0∑n(−1)i(in)=0,这是二项式定理中 a=1,b=−1;
- i=0∑ni×(in)=n2n−1,因为 m×(mn)=n×(m−1n−1)。
- 上指标求和(列求和):i=0∑n(mi)=(m+1n+1),可以看作是枚举第 m+1 个数的位置 i+1。
- 对角线求和:i=0∑n(im+i)=(nm+n+1),反复利用 Cnm=Cn−1m+Cn−1m−1 即可证明。
- 范德蒙德卷积:i=0∑k(in)(k−im)=(kn+m)。从组合意义上很容易证明(枚举 n 和 m 中选的个数),常用于合并组合数,考虑它的推论:
- i=1∑n(in)(i−1n)=(n−12n),证明很简单,因为 (i−1n)=(n−i+1n),(n−12n)=(n+12n);
- i=0∑n(in)2=(n2n),证明基本同理;
- i=0∑m(in)(im)=(mn+m),这个也是网格图路径计数方案。
- Lucas 定理。若 p 是质数,则 (mn)modp=(⌊m/p⌋⌊n/p⌋)⋅(mmodpnmodp)modp,常用于 p 较小的情况。
- 组合数奇偶性公式。(mn)≡1(mod2)⟺n & m=m,使用 Lucas 定理来证明,需保证不出现 (10)。
- Kummer 定理。(nn+m) 中质因子 p 的次数为 n+m 在计算时 p 进制意义下的进位次数,等价于 (mn) 中质因子 p 的次数等于在计算 n−m 时 p 进制意义下的借位次数。其中 p 是素数。
- 上指标翻转。(kn)=(−1)k(kk−n−1)。
多重组合数。是指先选 n1,再选 n2,以此类推。有(∑ni=n):
(n1,…,nkn)=∏i=1kni!n!
组合方法。在小学学过一些常用的组合方法。
n 只兔子参观大连市第二十四中学,其中 m 只兔子关系特别好,它们一定要站在一块。那么有多少种排列方法?
我们把这 m 只兔子看作一只大兔子,那么总共就有 n−m+1 只兔子,排列方案数是 (n−m+1)!,然而大兔子里面也有 m! 中方法,那么总方法数就是 (n−m+1)!m!。这就是捆绑法。
n 只兔子参观大连市第二十四中学,其中 m 只兔子有着不共戴天之仇,它们一定要不能站在一块。那么有多少种排列方法?
我们先把 n−m 只兔子给排列好,有 (n−m)! 种方法。这些兔子之间有 (n−m+1) 个空(算最左和最右),再把这些不共戴天的兔子放到这些空里,有 An−m+1m 个方法。总方案数就是 (n−m)!×An−m+1m。这就是插空法。
james1
要将 n 个相同的胡萝卜分给 m 只兔子,他秉持雨露均沾的原则,每只兔子至少分到 1 根胡萝卜,有多少种方案?
我们先介绍隔板法(插板法),是指在 n 个元素的 n−1 个空中插入 k 个板,可以把 n 个元素分为 k+1 组。
我们把这 n 个胡萝卜排成 1 行,当中就有 n−1 个空。现在往里面插入 m−1 个板,就可以将胡萝卜分为 m 组,正好可以分给 m 只兔子,而且由于不存在在同一个地方插两个板的情况,所以正好每一只兔子都能至少分到 1 根胡萝卜。那么答案就是 (m−1n−1)。
实际上这个问题相当于求不定方程 x1+x2+⋯+xm=n 的正整数解的数量。
如果他是个大魔王(不可能,绝对不可能
),有的兔子可能 1 根胡萝卜都得不到,那么有多少种方案?
同样的方法,如果允许有兔子分到 0 根胡萝卜,我们只需要再加上 m 根胡萝卜,就相当于刚才的问题了。答案是 (m−1n+m−1)=(nn+m−1)。
这个问题本质上是要求 x1+x2+⋯+xm=n 的自然数解的数量。