数学基础-组合数学

排列数

定义

n 个不同元素中任取 m(n,mN,mn) 个元素按照一定顺序排成一列,叫做从 n 个不同元素中取出 m 个元素的一个排列;从 n 个不同元素中取出 m 个元素的所有排列的个数,叫做从 n 个不同元素中取出 m 个元素的排列数,记作 Anm

计算公式

排列数的计算公式如下:

Anm=n(n1)(n2)...(nm+1)=n!(nm)!

其中 n!=i=1ni

组合数

n 个不同元素中任取 m(n,mN,mn) 个元素组成一个集合,叫做从 n 个不同元素中取出 m 个元素的一个组合;从 n 个不同元素中取出 m 个元素的所有组合的个数,叫做从 n 个不同元素中取出 m 个元素的组合数,记作 Cnm

计算公式

组合数的计算公式如下:

Cnm=Anmm!=n!m!(nm)!

其中,n!=i=1ni

对称性

Cnm=Cnnm

递推公式

Cnm=Cn1m1+Cn1m

三种实现方法

1.递推公式/杨辉三角
根据组合数的递推公式 Cnm=Cn1m1+Cn1m,用二维数组存储如下所示:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 ... ... ... ... 1

其中,f[n][m] 表示 Cnm
此方法的时间复杂度和空间复杂度均为 O(n2),但其只需进行加法运算,且每次查询的时间复杂度为 O(1),总时间复杂度为 O(n2+q)。此方法适用于 n 较小且查询次数 q 较多的情况。

2.计算所有 n! 及其乘法逆元 (n!)1
根据计算公式 Cnm=n!m!(nm)!,用两个一维数组分别存储 i! 及其乘法逆元 (i!)1,即 fac[i]=i!,fac_inv[i]=(i!)1,时间复杂度和空间复杂度均为 O(n)
查询时计算 Cnm=fac[n]×fac_inv[m]×fac_inv[nm]%p,时间复杂度为 O(1),总时间复杂度为 O(n+q)。此方法适用于 n 不太大且查询次数 q 较多的情况。

3.边乘边除
根据计算公式 Cmn=(nm+1)×(nm+2)×...×(n1)×n1×2×...×(m1)×m,每次乘 (nm+i) 同时除 i,防止答案过大上溢出错。可用双指针优化,分母能除则除尽。单次计算的时间复杂度为 O(m),空间复杂度为 O(1),对于 q 次查询,总时间复杂度为 O(q×m)。此方法适用于 n 较大但 m 不太大且查询次数 q 较少的情况。

posted @   catting123  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示