Python快速求组合数C(n,m)三种方法整理

本文整理了三种快速求解组合数C(n,m)的方法,适用于不同规模的n和m。方法一:直接计算阶乘;方法二:递归计算;方法三:结合逆元和快速幂思想,适用于大数情况。文中还介绍了同余定理、模运算、逆元和费马小定理等相关概念,并提供了Python实现代码。" 114534367,10544845,Java实现HTTPS服务器接口教程,"['JAVA的https接口', '后端开发', 'Spring框架', 'HTTP请求', '文件操作']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

百度百科对于组合数的定义是:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。
由于经常遇到一些组合数问题,所以整理一些常见的快速求组合数的方法,附上Python的实现代码。

一、m,n不是特别大的时候:

( n m ) = n ! m ! ∗ ( n − m ) ! \binom {n}{m}=\frac {n!}{m!*(n-m)!} (mn)=m!(nm)!n!
可以直接调用math.factorial求得阶乘,然后算出组合数,如下:

import math
n,m = map(int,input().split())
print(math.factorial(n)//(math.factorial(m)*math.factorial(n-m)))

输入:

5 3

输出:

10

二、用定义式递归:

( n m ) = ( n − 1 m − 1 ) + ( n − 1 m ) \binom {n}{m}=\binom {n-1}{m-1}+\binom {n-1}{m} (mn)=(m1n1)+(mn1)
递归出口就在于当n=m或者m=1的时候。

n,m = map(int,input().split())
def rec(n,m):
    if m == n:
        return 1
    elif m == 1:
        return n
    else:
        return rec(n-1,m-1)+rec(n-1,m)
    
print(rec(n,m))

输入:

10 3

输出:

120

三、逆元+快速幂思想参考大佬

前面的两种方法,在n,m数字很大的时候,运行时间会很长。在介绍第三个方法之前,先来介绍几个概念,不当之处,欢迎指点。

(1)、同余定理

百度百科:同余定理数论中的重要概念。给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m)。对模m同余是整数的一个等价关系。

53(mod 2) #5和 3对模2同余
(2)、模的加减乘除运算

取模运算的等价变形适合加法、减法、乘法
( a + b ) % p = ( a % p + b % p ) % p (a + b) \% p = (a \% p + b \% p) \% p

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值