一、排列

1、不可重复排列

A n r = n ( n − 1 ) ( n − 2 ) . . . ( n − r + 1 ) {A}^{r}_{n}\, =\, n(n-1)(n-2)...(n-r+1) Anr​=n(n−1)(n−2)...(n−r+1)

A n r = n ! ( n − r ) ! {A}^{r}_{n}\, =\, \frac {n!} {(n\, -\, r)!} Anr​=(n−r)!n!​

2、可重复排列

n r {n}^{r} nr

3、圆排列

**定义:**有一组元素,将其排成一个圆,这种排列叫做圆排列或项链排列。

  • ​ n个数的圆排列为(n-1)!
  • ​ n个不同数中取r个的圆排列:

P n r r = A n r r = n ! ( n − r ) ! × r \frac {{P}^{r}_{n}} {r}\, =\, \frac {{A}^{r}_{n}} {r}\, =\, \frac {n!} {(n-r)!\, \times r} rPnr​​=rAnr​​=(n−r)!×rn!​

4、不尽相异元素全排列

定义:如果n个元素里,有p个元素相同,又有q个元素相同,…,又有r个元素相同(p+q+…+r≤n),则它们的所有排列种数为:
n ! p ! q ! . . . r ! \frac {n!} {p!q!...r!} p!q!...r!n!​
uva 11076

二、组合

1、不可重组合数

C n r = n ! r ! ( n − r ) ! {C}^{r}_{n}\, =\, \frac {n!} {r!(n-r)!} Cnr​=r!(n−r)!n!​

2、可重组合数(隔板法)

转换思路,既然要抽r次,就要放回r-1次,最后一次的放回对抽样结果无影响

那么就变成我把r-1个物品放入n里,然后一次抽取k个。
H n r = C n + r − 1 r = ( n + r − 1 ) ! r ! ( n − 1 ) ! {H}^{r}_{n}{\, =\, C}^{r}_{n+r-1}\, =\, \frac {(n+r-1)!} {r!(n-1)!} Hnr​=Cn+r−1r​=r!(n−1)!(n+r−1)!​

3、不相邻组合数

3.1从n个球中选出r个球,要求r个球互不相邻

分析:

  • 当n<2r-1时,取法为0种
  • 当n≥2r-1时,取法为

C n − r + 1 r {\, \, C}^{r}_{n-r+1}\, Cn−r+1r​

理解思路:先从n中拿取r-1个球,然后我们在剩下的n-r+1个球中任取r个球,一开始的r-1个球填入r个球的空位中,这样就可以使r个球互不相邻。

3.2从n个围成一圈的球中选出r个球

分析:

当n<2r时,取法为0种

当n≥2r时,取法为
n C n − r r n − r \frac {{nC}^{r}_{n-r}} {n-r} n−rnCn−rr​​
理解思路: 无论怎么取,都是两种情况, 一种包括一号,另一种不包括一号。

包括一号:
C n − r − 1 r − 1 {C}^{r-1}_{n-r-1} Cn−r−1r−1​
不包括一号:
C n − r r {C}^{r}_{n-r} Cn−rr​

4、常用组合函数公式

$$
{C}^{r}{n}, =, {C}^{r}{n-1}, +, {C}^{r-1}_{n-1}

$$

C n r = C n n − r {C}^{r}_{n}\, =\, {C}^{n-r}_{n}\, Cnr​=Cnn−r​

C n r + 1 = n − r r + 1 C n r {C}^{r+1}_{n}\, =\, \frac {n-r} {r+1}{C}^{r}_{n}\, Cnr+1​=r+1n−r​Cnr​

板子

一、排列组合数

1、费马小定理(要求模数为质数)

复杂度O(nlogn),当n到1e7时就炸,这时候要用线性递推。

typedef long long ll;
const ll maxn = 1e6+10, mod = 1e9+7;
ll Jc[maxn];
void calJc()    //求maxn以内的数的阶乘
{Jc[0] = Jc[1] = 1;for(ll i = 2; i < maxn; i++)Jc[i] = Jc[i - 1] * i % mod;
}
ll pow(ll a, ll n, ll mod)    //快速幂 a^n % p
{ll ans = 1;while(n){if(n & 1) ans = ans * a % mod;a = a * a % mod;n >>= 1;}return ans;
}
ll niYuan(ll a)   //费马小定理求逆元
{return pow(a, mod - 2, mod);
}
ll C(ll n, ll r)    //计算C(n, r)
{return Jc[n] * niYuan(Jc[r]) % mod* niYuan(Jc[n - r]) % mod;
}
ll A(ll n, ll r)
{return Jc[n] * niYuan(Jc[n-r])%mod;
}

2、拓展欧几里得(不要求模数为质数)

复杂度同上,关键点在他的模数不需要是质数。

typedef long long ll;
const ll maxn = 1e6+10, mod = 1e9+7;
ll Jc[maxn];
void calJc()    //求maxn以内的数的阶乘
{Jc[0] = Jc[1] = 1;for(ll i = 2; i < maxn; i++)Jc[i] = Jc[i - 1] * i % mod;
}
void exgcd(ll a, ll b, ll &x, ll &y)    //拓展欧几里得算法
{if(!b) x = 1, y = 0;else{exgcd(b, a % b, y, x);y -= x * (a / b);}
}
ll niYuan(ll a)   //求a对b取模的逆元
{ll x, y;exgcd(a, mod, x, y);return (x + mod) % mod;
}
ll C(ll n, ll r)    //计算C(n, r)
{return Jc[n] * niYuan(Jc[r]) % mod* niYuan(Jc[n - r]) % mod;
}
ll A(ll n, ll r)
{return Jc[n] * niYuan(Jc[n-r])%mod;
}

3、逆元-线性递推(p是质数)

typedef long long ll;
const ll maxn = 1e7+10, mod = 1e9+7;
ll Jc[maxn];
ll inv[maxn+5];
void getInv(ll mod)
{inv[1]=1;for(int i=2;i<maxn;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
void calJc()    //求maxn以内的数的阶乘
{Jc[0] = Jc[1] = 1;for(ll i = 2; i < maxn; i++)Jc[i] = Jc[i - 1] * i % mod;
}ll C(ll n, ll r)    //计算C(n, r)
{return Jc[n] * inv[Jc[r]] % mod* inv[Jc[n - r]] % mod;
}
ll A(ll n, ll r)
{return Jc[n] * inv[Jc[n-r]]%mod;
}

资料参考:

(24条消息) ACM-组合数学完全总结(知识点+模板)_Ogmx的博客-CSDN博客_组合数学

排列组合的基础(入门必备!!)相关推荐

  1. 全站最全面的Python 基础入门必备知识大全,学完即就业!【建议收藏仔细学习】

    前言: Python作为21世纪最火的编程语言,市面上各种学习视频层出不穷,关于Python的学习氛围也逐渐浓厚!!最近一段时间越来越多的知友们在私信我,希望我出一期python基础入门的内容,肝了N ...

  2. Java基础入门必备词汇汇

    #Java基础入门必备词汇汇 一 1.Public ['pʌblik] 公开 2.Static ['stætik] 静态 3.void [vɔid] 无返回 4.main [main] 主要的,主方法 ...

  3. 零基础学习3D建模:14个建模小技巧!零基础入门必备!

    01.访问任何东西 "作为一名Cinema 4D用户,我会用自己最喜欢的顶级技巧来解决任何问题," 3D World的编辑Rob Redman 说道."四维影院拥有的选项 ...

  4. 零基础入门必备的Linux命令和C语言基础

    挂载一个文件系统(底部有视频资料) mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在 umount /dev/hda2 卸 ...

  5. 零基础入门必备:搞懂压力测试和负载测试

    某些时候两个概念会混淆在一起. 但是要分开的话,就是这样--------(引用一下pcl的话) 压力测试(STRESSTEST)和负载测试(LOADTEST)的区别是什么?" 先让我们先了解 ...

  6. 排列组合的简单应用(隔板法)

    高中数学的排列组合,在许多题目中也有应用.甚至可以达到更快的解题速度,同时也会减少时间复杂度. 一般应用 拿NYOJ的一道题为例.https://acm.nyist.edu.cn/p/210. 通过读 ...

  7. 程序员必备算法,排列组合

    还记得排列组合吗? 在高中的时候最常接触的莫过于排列组合了,毕竟高考必考的嘛.我们先来回忆下这两个的公式是啥: 排列组合公式 如果看到这个还有一丢丢的印象,说明大家的基础都还不错.那么问题来了,大家都 ...

  8. 【Python基础】Python中的高效迭代库itertools,排列组合随便求

    本文目录 一.模块概述 二.组合生成器 2.1 product 2.2 permutations 2.3 combinations 2.4 combinations_with_replacement ...

  9. 【深度学习笔记】零基础入门深度学习必备知识

    文章目录 1.[深度学习必备基础知识] 2.[入门必备数学知识] 3.[Python必备基础] 4.[深度学习框架开发基础入门] 1.[深度学习必备基础知识] 深度学习的发展历程 机器学习 深度学习如 ...

最新文章

  1. R语言plotly可视化:plotly可视化基本散点图(指定图像类型、模式)、plotly可视化散点图(为不同分组数据配置不同的色彩)、ggplotly使用plotly包呈现ggplot2的可视化结果
  2. 万众瞩目,2018中国企业数字化转型国际峰会,重磅来袭
  3. 皮一皮:据说有个新娘打扮成了奥特曼...
  4. 这才是数据挖掘领域常用的机器学习算法!
  5. 教程干货——零基础创建简单的在线审批流程
  6. “苹果税”猛于虎惹众怒,库克:我们是不会让步的
  7. Visual Studio 解决方案版本从v12-->v14
  8. shell脚本学习(3)文件判断
  9. 自己创建一个本地服务器,实现文件下载
  10. Word基础(八)带圈字符
  11. 华为模拟器eNSP下载与安装(win10系统)
  12. 安装mysql电脑开机蓝屏_电脑开机蓝屏怎么解决。
  13. kaminari 简要文档
  14. 创业公司该如何设计激励员工的期权池
  15. 计算机硬件大型作业报告,计算机硬件技术大作业报告 (2).doc
  16. 小米生态链布局遇阻,求快的小米却更慢了
  17. 美团 R 语言数据运营实战
  18. 不同场所最低疏散净宽度汇总
  19. 樱桃键盘驱动在哪下_双十一这四款性价比樱桃轴机械键盘值得一看_搜狐汽车...
  20. 检测你的黑苹果系统主板是否支持原生NVRAM

热门文章

  1. 四、SOCKET 协议
  2. 手机练习linux指令,linux基础命令练习1
  3. uni.openDocument 微信小程序在苹果手机打开文档失败
  4. 2019.7笔记本推荐指南by tyut程序爱好者协会 编辑@笔吧夏蒙乾
  5. Python 强制类型转换
  6. 庆祝六一,特奉上礼物一份,shell脚本的相关练习
  7. Python求解线性代数方程组
  8. 鸟哥的Linux私房菜(基础篇)-第三章、主机规划与磁盘分区(三.2. 磁盘分区)
  9. 基于声网 Flutter SDK 实现互动直播
  10. 一辈子是场修行,短的是旅行,长的是人生 .