『笔记』组合数学

定义

简单的定义是组合数学就是在学用来解决和组合相关问题的一个工具箱。复杂的一点的定义是,组合数学的主要内容能够分为四大类:计数类,生成类,证实类,设计类。数组

排列组合是组合数学中的基础。排列就是指从给定个数的元素中取出指定个数的元素进行排序;组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。排列组合的中心问题是研究给定要求的排列和组合可能出现的状况总数。排列组合与古典几率论关系密切。工具

排列数公式计算方法

(1)定义式优化

公式简记为:spa

\[A_{n}^{m}= \frac{n!}{(n-m)!} \]

组合数公式计算方法

(1) 定义式设计

公式能够简单记为:blog

\[\dbinom{n}{m}=\frac{n!}{m! (n-m)!} \]

或者:排序

\[C^{m}_{n}=\frac{n!}{m! (n-m)!} \]

表示从 \(n\) 个数中选 \(m\) 个数的方案数ip

(2) 模意义get

适用于\(n\le1e9,m\le 1e5\)的较大模运算,小的也能够数学

首先根据定义式咱们能够将\((n-m)!\)所有消去

得出式子

\[\frac{\prod_{i=n-m+1}^{n}i}{m!}\ mod \ p \]

进而求得

\[\prod_{i=n-m+1}^{n}\times \ m!^{p-2}\ mod\ p \]

(3) 高精法

适用于答案过大时的计算

依旧是(2)中的第一个式子,经过高精乘法来实现,若是有多个相加还要加上高精加法,难度不大,好记

代码

(4) \(Lucas\) 定理

\(Lucas\) 定理用于求解大组合数取模的问题,其中 \(p\) 必须为素数。正常的组合数运算能够经过递推公式求解,但当问题规模很大,而模数是一个不大的质数的时候,就不能简单地经过递推求解来获得答案,须要用到 \(Lucas\) 定理。

能够大量减小运算量和时间

预先处理好\(0-(mod-1)\)的模意义下的阶乘和逆元,求得时候\(O(1)\)代入便可

一个应用公式为

\[C_{n}^{m}=C_{n/p}^{m/p}\times C_{n \ mod \ p}^{m\ mod\ p} \]

实际应用时的公式为

\[Lucas(n,m)=Lucas(n/p,m/p)\times C_{n \ mod \ p}^{m\ mod\ p} \]

其中\(Lucas(n,0)=1\)利用这个公式进行返回便可

固定模数代码

多重询问,非固定模数代码

其他待添加……

组合数思想方法

  • 插空法

(1)空隙内必须有值的状况

当遇到一些有特殊限制的,而且能够重复取的问题时,咱们能够用这个方法进行求解。

假设一个问题,有一个数 \(g\),要求求 \(k\) 个数组成 \(g\) 的方案数

这个问题就是插空法的经典例子了,首先能够把 \(g\) 个数想象成 \(g\) 个小球,小球之间一共有 \(g-1\) 个空隙,要把这 \(g\) 个小球分红 \(k\) 份,即在这空隙中插上 \(k-1\) 个隔板,转换成求插空的方案数
也就是求

\[C_{g-1}^{k-1} \]

的值

(2)空隙内能够没有值的状况

假设有 $n $ 个篮球,要求分给\(k\)我的,每一个人能够没有篮球

那么就是有 \(k-1\) 个隔板来插空,可是能够同时排列在同一个空隙中,那么就是求 \(n+k-1\) 个位置中,选出 \(k-1\) 个位置来填充

公式记为

\[C_{n+k-1}^{k-1} \]

  • 二维求放置方案

一、\(n \times n\) 的矩阵上放置 \(n\) 个车,每一个车不相同,每行每列只能放置一个车求放置方案数

第一行有 \(n\) 种选择:第二行有 \(n-1\) 种选择,第三行 \(n-2\) 种选择\(...\)\(n\) 行有一种选择

公式为

\[n! \]

二、\(n \times n\) 的矩阵上放置\(k\)个车,求放置方案数

\(n\) 行中选 \(k\) 行,\(n\) 列中选 \(k\)

公式为

\[C_{n}^{k} \times C_{n}^{k} \times k! \]

为何要有 \(k!\) 在个人理解中由于只是位置肯定了,可是每一个位置放哪个小车并不知道,因此一共共有 \(k!\) 中在上面摆放的可能

三、\(n \times m\)的矩阵上放置 \(k\) 个车,求放置方案数

合在上面的相似,即

\[C_{n}^{k} \times C_{m}^{k} \times k! \]

四、\(n \times m\)的矩阵上放置 \(k\) 个车,要求不能同行或者同列,求放置方案数(本身推得式子,可能会出错,欢迎纠错)

咱们能够把\(n\)分红两份,在两个矩形中找弄式子

\[\sum_{i=0}^{k}C_{n/2}^{i}\times C_{m-(k-i)}^{i}\times i! \times C_{n-n/2}^{k-i} \times C_{m}^{k-i}\times (k-i)! \]

注意此时\(0!=1\)

五、关于不规则矩阵的排列,详情课件P1350

典型例题

P2822 [NOIP2016 提升组] 组合数问题

分析

  • 30pts 暴力枚举,一会就溢出了

  • 70pts 运用组合公式的推论

\[C^{m}_{n}=C^{m-1}_{n-1}+C^{m}_{n-1} \]

能够直接递推求解,惟一要注意的是要进行初始化

\[C^{0}_{0}=C^{0}_{1}=C^{1}_{1}=1 \]

  • 90pts 运用取模防止溢出的方法加速运算

\[C^{m}_{n}\ mod\ k=C^{m-1}_{n-1}\ mod\ k+C^{m}_{n-1}\ mod \ k \]

最后判断一下是都知足 \(0\) 便可,最后存一个数组里一个一个加求和

  • 利用杨辉三角优化

咱们经过杨辉三角的方法来把全部的方案数都列出来能够获得这么一个图形

经过这个式子很简单的能够发现(行是 \(n\) 列为 \(m\) )

\[C^{m}_{n}=\begin{cases} C^{m-1}_{n}+C^{m}_{n-1} -C^{m-1}_{n-1}\ \ \ \ (C^{m}_{n}\ mod \ k\ !=0) \\ \\ C^{m-1}_{n}+C^{m}_{n-1} -C^{m-1}_{n-1}+1\ \ \ \ (C^{m}_{n}\ mod \ k\ =0) \end{cases}\]

因而乎,你就能够快乐的用 \(O(1)\) 作完这个题

代码实现

P1313 [NOIP2011 提升组] 计算系数

思路

经过枚举 $ k\le 5 ,a=1$的全部系数排列发现是一个杨辉三角

而且\(x^ny^m\)的系数所在的位置为\((k+1,k-n+1)\)

最后的系数乘上\(a^nb^m\)便可

注意开$long\ long $

代码实现

P6057 [加油武汉]七步洗手法

思路

首先由于是彻底图的缘故,那么由各个顶点组成的三角形一共有

\[\sum_{i=1}^{n-2} \frac{(n-i-1) \times (n-i)}{2} \]

其次看题目,要找同色三元环的数量,而且根据提示,所给的 \(m\) 条边均没有组成自环的,因此只多是黑色三元环

那么首先求出白色边会破坏的三角形数量,每个为\((n-2)\)个三角形,那么一共破坏的是

\[\sum_{i=1}^{m} \ (n-2) \]

可是其中咱们会发现的是,每当一个点所链接的白边数\(poi_i\geq 2\)时,都会出现重叠的状况,而且每次重叠了\(poi_i-1\)个,因此每个点一共重叠考虑的是

\[\sum_{i=1}^{poi_i-1}\ i \]

条边

那么转化为公式就是一共重叠考虑的边为

\[\sum_{i}^{n} \frac{(poi_i-1)\times(poi_i)}{2} \]

最后减去白色所影响的边,加上重复考虑的边,即为答案

代码实现

P1066 [NOIP2006 提升组] 2^k进制数(重点+高精)

思路

由于是高精,因此就直接重点讲解一下=_=

先看一看题意

\(r\) 是个 \(2^k\) 进制数,并知足如下条件:

  • \(r\) 至少是个 \(2\) 位的 \(2^k\)进制数。

  • 做为 \(2^k\) 进制数,除最后一位外,\(r\) 的每一位严格小于它右边相邻的那一位。

  • \(r\) 转换为二进制数 \(q\) 后,则 \(q\) 的总位数不超过 \(w\)

在这里,正整数 \(k,w\) 是事先给定的。

问:知足上述条件的不一样的 \(r\) 共有多少个?

首先把重点锁定在最高位上便可

题目给出的定义是,把转化后的二进制串一共分红了 \(w/k\) 个整段,也许还有一个长度小于 \(k\) 的段

1、先来讨论一下刚好分红 \(w/k\) 段的状况

这种状况下,每一段能够选择的数为\(0…2^k-1\)中的一个

而且能够选择 \(2-w/k\)个数来拼凑,能够发现这是一个有序的,符合组合数的性质,就能够获得公式

\[ans= \sum_{i=2}^{w/k}\ C_{2^k-1}^{i} \]

2、当有一段 \(<\) \(k\) 的时候

这个状况,能够先看一看最高位一共占了几个二进制位

经过简单分析能够获得,一共是\(len=w\)%\(k\)的长度

那么能够取到的数有 \(1…2^{len}-1\)

由于若是有前导 \(0\) 会致使和前面的重复,因此不予考虑

因此就在选了前\(w/k\)的数的基础上再+1,构成最终满的排列

由于在最高位选了数 \(i\),因此就只能在\(2^k-1-i\)中选择

于是获得公式

\[ans=\sum_{i=2}^{w/k}\ C_{2^k-1}^{i}+\sum_{i=1}^{2^{w\ mod\ k}-1}C_{2^{k}-1-i}^{w/k} \]

求解就能够啦,注意高精便可

代码实现

P1771 方程的解

思路

插空法+高精乘法,详情请看上方,注意开$long \ long $

代码实现

P1350 车的放置

思路

直接根据二维内的公式进行分离并求式子,分红 \(a\times (b+d)\) 的和 \(c\times d\) 的两个矩阵,推出式子

\[\sum_{i=0}^{k}C_{a}^{i}\times C_{b+d-(k-i)}^{i}\times i! \times C_{c}^{k-i} \times C_{d}^{k-i}\times (k-i)! \]

注意此时\(0!=1\)

为何要有 \(b+d(k-i)\)

由于在第二个矩形中确定已经找完了\((k-i)\)行,不能再在第一个矩形里面找了,因此要把这些状况所有减去

代码实现

10235. 「一本通 6.6 练习 6」序列统计

思路

$ Lucas$ 定理的实际应用

也就至关于把 \(n\) 个相同的球放到了\(R-L+1\)个盒子里,球能够不放完,盒子能够为空

那么再加一个盒子,把没有放的都放到那个盒子里面

那么这个题目就至关于在\(R-L+2\)个盒子中放上 \(n\) 个球的方案

也就是 \(n\) 个篮球,有\(R-L+1\) 个隔板,能够挨着排列,求方案数

经典的隔板法

简单理解为插板法的第二种方法

获得公式为

\[ans=C_{n+R-L+1}^{R-L+1}-1 \]

模数较小用\(Lucas\)定理作便可

代码实现

相关文章
相关标签/搜索