组合数
1.阶乘的写法
C n m = A n m A m m = n ! ( n − m ) ! ∗ 1 m ! C_n^m=\frac{A_n^m}{A_m^m}=\frac{n!}{(n-m)!}*\frac{1}{m!} Cnm=AmmAnm=(n−m)!n!∗m!1
# import math
# math.factorial() ,math里也自带了阶乘函数
def factorial(n):
res = 1
for i in range(2, n + 1):
res = res * i
return res
def Combinatorial(n, m):
return factorial(n)//(factorial(m)*factorial(n-m))
2.直接实现
C n m = n ( n − 1 ) . . . ( n − m + 1 ) m ( m − 1 ) . . . 1 C_n^m=\frac{n(n-1)...(n-m+1)}{m(m-1)...1} Cnm=m(m−1)...1n(n−1)...(n−m+1)
def Combinatorial(n, m):
Min = min(m,n-m)
res = 1
for i in range(0, Min):
res = res * (n-i) / (Min-i)
return res
3.利用组合恒等式递归
组合恒等式:
C
n
m
=
C
n
n
−
m
=
C
n
−
1
m
−
1
+
C
n
−
1
m
C_n^m=C_n^{n-m}=C_{n-1}^{m-1}+C_{n-1}^m
Cnm=Cnn−m=Cn−1m−1+Cn−1m
个人觉得这个恒等式可以理解成,n个里选m个等于以下两种情况的和:(1).选第一个,后面n-1个里选m-1个;(2).不选第一个,后面n-1个里选m个;
def Combinatorial(n,m):
if m == n:
return 1
elif m == 0:
return 1
return Combinatorial(n-1, m-1) + Combinatorial(n-1, m)
4.还可以用快速幂求
略…想起来再补