acwing算法基础之数学知识--求组合数基础版

news/2024/7/7 21:12:21

目录

  • 1 基础知识
  • 2 模板
  • 3 工程化

1 基础知识

(一)
组合数 C n k C_n^k Cnk的计算公式,
C n k = n ! k ! ⋅ ( n − k ) ! C_n^k=\frac{n!}{k!\cdot (n-k)!} Cnk=k!(nk)!n!
故可以这样计算,

int compute_combination_n_k(int n, int k) {
    if (k > n) {
        return -1;//输入参数不合法
    }
    long long a = 1, b = 1, c = 1;
    for (int i = 1; i <= n; ++i) {
        a = a * i; //计算a时,可能会超出long long范围
    }
    for (int i = 1; i <= k; ++i) {
        b = b * i;
    }
    for (int i = 1; i <= n - k; ++i) {
        c = c * i;
    }
    long long res = a / b / c;
    return res;
}

该计算方法的缺点是,在计算 n ! n! n!时,可能会超出long long范围。

(二)
第(一)中的公式进行简化,有,
C n k = n ⋅ ( n − 1 ) ⋯ ( n − k + 1 ) 1 ⋅ 2 ⋯ k C_n^k=\frac{n\cdot(n-1)\cdots(n-k+1)}{1\cdot 2\cdots k} Cnk=12kn(n1)(nk+1)
注意需要满足 k ≤ n k\leq n kn
将上述公式转换为代码,如下所示,

int compute_combination_n_k(int n, int k) {
	if (k > n) {
		return -1; //-1表示无效值。
	}
	
	long long a = 1;//表示分子
	long long b = 1;//表示分母
	for (int i = 1; i <= k; ++i) {
		a = a * (n - i + 1); //注意这一步可能会超出long long最大值
		b = b * i;
	}
	long long res = a / b;
	return res;
}

上述代码在计算分子时比较容易超出long long,一般不采取这种计算方法,除非n比较小。

(三)
组合数的递推公式,
C n k = C n − 1 k − 1 + C n − 1 k C_n^k=C_{n-1}^{k-1}+C_{n-1}^{k} Cnk=Cn1k1+Cn1k
注意需要满足 k ≤ n k\leq n kn

利用该公式可以在 O ( n ) O(n) O(n)时间复杂度下求出N以内的所有组合数,代码如下,

const int N = 2010;
int c[N][N];

for (int i = 0; i < N; ++i) {
	for (int j = 0; j <= i; ++j) {
		if (!j) {
			c[i][j] = 1;
		} else {
			c[i][j] = c[i-1][j-1] + c[i-1][j];
		}
	}
}

使用上述计算方法,一般不会超出long long范围。

2 模板

暂无。。。

3 工程化

暂无。。。


http://lihuaxi.xjx100.cn/news/1827173.html

相关文章

千兆光模块和万兆光模块的发展趋势

千兆光模块和万兆光模块是一种高速光电子器件&#xff0c;以其高速传输、长距离传输和高可靠性而广受关注。光模块是光学通讯系统中极为重要的组成部分之一。不同类型的光模块由于其不同的特性&#xff0c;可以适用于不同的应用场景。下面我们将着重介绍千兆光模块和万兆光模块…

在.bashrc文件修改环境变量的做法

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> ~/.bashrc文件是linux下保存环境变量的系统文件。原以为使用sed命令修改.bashrc文件&#xff0c;实际上不行&#xff0c;需要使用echo命令。具体示例如下…

vtk数组操作

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题&#xff1a;vtk数组操作 ArrayLookup&#xff1a;获取指定值vtkIdType 索引或索引集合 distances->LookupValue(15); //或者 vtkNew<vtkIdLis…

物流实时数仓:数仓搭建(ODS)

系列文章目录 物流实时数仓&#xff1a;采集通道搭建 物流实时数仓&#xff1a;数仓搭建 文章目录 系列文章目录前言一、IDEA环境准备1.pom.xml2.目录创建 二、代码编写1.log4j.properties2.CreateEnvUtil.java3.KafkaUtil.java4.OdsApp.java 三、代码测试总结 前言 现在我们…

和奇葩领导的相处之道

目录 1 和奇葩部门领导做项目的经历2 奇葩领导对团队产生的影响2.1 不和谐的团队氛围2.2 合作过程中的摩擦和阻碍2.3 下属的挫折批评和不公平对待 3 与奇葩领导相处的经验教训结语 在职场中&#xff0c;与不同的领导和同事打交道是家常便饭。&#xff0c;接触的人多了&#xff…

Java反射调用kotlin中的类,Object类,Companion对象

Java反射调用kotlin中的类&#xff0c;Object类&#xff0c;Companion对象 1. Java反射调用kotlin中的普通类 kotlin普通类&#xff1a; package com.common; class TestNormal {fun get():String{return "Nolmal abc"}fun showNum(v:Int){println("Nolmal s…

展现天津援疆工作成果 “团结村里看振兴”媒体采风团走进和田

央广网天津11月19日消息(记者周思杨)11月18日&#xff0c;由媒体记者、书法和摄影家、旅行社企业代表等40余人组成的“团结村里看振兴”媒体采风团走进新疆和田。在接下来的一周时间里&#xff0c;采风团将走访天津援疆和田地区策勒县、于田县、民丰县乡村振兴示范村&#xff0…

Mongodb操作带有$符号开头的字段

自5.0版本开始&#xff0c;针对以dollar&#xff08;$&#xff09;字符开头的字段名称和包含点号&#xff08;.&#xff09;的字段名称&#xff0c;mongodb在使用上做了增强。这对带有这两个符号字段名称的数据存储&#xff0c;mongodb修改了验证规则&#xff0c;操作带有这两种…