`算法知识` 组合数算法


组合数算法

求组合数的两个公式

定义式 : C a b = A a b b ! 定义式: \quad C_a^b = \frac{A_a^b}{b!} 定义式:Cab=b!Aab

递推式 : C a b = C a − 1 b − 1 + C a − 1 b 递推式: \quad C_{a}^{b} = C_{a - 1}^{b - 1} + C_{a - 1}^{b} 递推式:Cab=Ca1b1+Ca1b

等价式 : C a b = C a a − b 等价式: \quad C_{a}^{b} = C_{a}^{a - b} 等价式:Cab=Caab


必须满足: a >= b >= 0, 对于非法值 规定为0, 最好对于会产生非法值的情况, 特殊处理!

比如: C[3][3] = C[2][2] + C[2][3], 其中C[2][3]是非法值, 规定为0

比如: C[3][0] = C[2][-1] + C[2][0], 其中C[2][-1]是非法值, 规定为0

对于C[0][0]应该是多少呢? 他不是非法值;
C[1][1] = C[0][0] + C[0][1] = 1, 由于C[0][1]是非法值 为0
故: C[0][0] = 1


定义式


若不在取模意义下

get_C( int _a, int _b){
    _b = min( _b, _a - b);
    
    ans = 1;
    
    for( i = 1; i <= _b; ++i){
        ans *= ( _a - _b + i);
        ans /= i;
    }
    
    return ans;
}
  1. 由于for循环次数, 取决于b的值, 故先让其取最小值
  2. 计算: (a * (a-1) * (a-2) * ... * (a-b+1)) / (b * (b-1) * ... * 1) 如果先计算a / b, 这可能不是整除; 而我们知道, 其结果一定是整数; 故, 要从右侧开始, 这是可以整除的. 比如, 此时分母是i, 则分子是连续的i个数; 而连续的i个数里, 一定有i`的倍数

时间复杂度 : O ( b ) 时间复杂度: O(b) 时间复杂度:O(b)


若在取模意义下

TODO

递推式

可用于 取模 或 不取模的情况均可.

通常适用在预处理数组的情景下, 即通过递推式来统一预处理数组, 然后就可以O(1)的查询结果

C[ N + 2][ M + 2];

init_C(){
    for( i = 0; i <= N; ++i){
        C[ i][ 0] = 1;
        C[ i][ i] = 1;
        
        for( int j = 1; j < i; ++j){
            C[ i][ j] = C[ i - 1][ j - 1] + C[ i - 1][ j];
            C[ i][ j] %= Mod_;   //< 如果需要取模
        }
    }
}

对于[i][0][i][i], 必须要特殊处理, 对于会产生非法值的情况 要特殊处理:

  1. [i][0]的递推式中[i - 1][ -1]是非法值
  2. [i][i]的递推式中[i - 1][i]是非法值

时间复杂度 : O ( n ∗ m ) , 且 O ( 1 ) 查询 时间复杂度: O(n * m), 且O(1)查询 时间复杂度:O(nm),O(1)查询


例题分析

A = 1e6, B = 50, 我们会频繁的访问: C[ x + y][ x], 且x <= A, y <= B

乍一看, C[a][b], 两者都是A = 1e6的量级, 看似是无法预处理的

但是, C[ x + y][ x] = C[ x + y][ y], 即C[ 1e6][ 50]的量级!

等价式转换在这里非常重要; 因此, 该问题是可以用预处理数组方式的!

时间复杂度 : O ( 1 e 6 ∗ 50 ) 时间复杂度: O(1e6 * 50) 时间复杂度:O(1e650)

第一章 引论 11 组合数学研究的对象 1.2 组合问题典型实例 1.2.1 分派问题 1. 2.2 染色问题 1.2.3 幻方问题 1.2.4 36军官问题 1.2.5 中国邮路问题 习 题 第二章 排列与组合 2.1 两个基本计数原理 2.2 无重集的排列与组合 2.3 重集的排列与组合 2.4 排列生成算法 2.4.1 序数法 2.4.2 字典序法 2.4.3 轮转法 2.5 组合生成算法 .2.6 应用举例 习 题 第三章 容斥原理 3.1 引 言 3.2 容斥原理 3.3 几个重要公式 3.4 错位排列 3.5 有限制的排列 3.6 棋阵多项式 3.7 禁位排列 习 题 第四章 鸽巢原理 4.1 鸽巢原理 4. 2 鸽巢原理的推广形式 4. 3 ramsey数 4.4 ramsey数的性质 4.5 ramsey定理 习 题 第五章 母函数 5.1 母函数概念 5.2 幂级数型母函数 5.3 整数的拆分 5.4 ferrers图 5.5 指数型母函数 习 题 第六章 递归关系 61 引言 6.2 几个典型的递归关系.. 6.3 用母函数方法求解递归关系 6.4 常系数线性齐次递归关系的求解 6.5 常系数线性非齐次递归关系的求解 66 非常系数非线性递归关系的求解 6.7 差分表法 6.8 stirling数 习 题 第七章 polya定理 7.1 有限集的映射 7.2 群的基本概念 7.3 置换群 7.4 置换的奇偶性 7.5 置换群下的共轭类 7.6 burnside引理 7.7 polya定理 7.8 polya定理的母函数型式 7.9 不标号图的计数 习 题 第八章 图论基础 8.1 图的基本概念 8.2 同构图、完全图与二分图 8.3 通路、回路与图的连通性 8.4 euler图与hamilton图 8.5 割集与树 8.6 图的矩阵表示法 8.7 平面图、对偶图与色数 8.8 匹配理论 8.9 网络流 习 题 第九章 拉丁方与区组设计 9.1 引言 9.2 拉丁方 9.3 有限域 9.4 正交拉丁方的构造 9.5 完全区组设计 9.6 平衡不完全区组设计(bibd) 9.7 区组设计的构造 9.8 steiner三连系 9.9 hadamard矩阵 习 题 第十章 线性规划 10.1 lp问题引例 10.2 lp问题的一般形式 10.3 lp问题的标准型 10.4 可行域和最优可行解 10.5 单纯形法 10.6 单纯形表格法 10.7 两阶段法 10.8 对偶原理 10.9 对偶单纯形法 10.10 应用举例 习 题 第十一章 组合优化算法与计算的时间复杂度理论 111 dijkstra算法 11.2 floyd算法 11.3 kruskal算法 11.4 求最优树的破圈法和统观法 11.5 二分图中最大匹配与最佳匹配的算法 116 fleury算法 11.7 中国邮路问题及其算法 11.8 深度优先搜索法--dfs算法 11.9 项目网络与关键路径法 1110 网络最大流算法 1111 状态转移法 1112 好算法、坏算法和np类问题 1113 npc类问题 1114 货郎问题的近似解 习 题... 参考文献
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值