排列组合公式:

全排列 java api 全排列组合计算公式_多重集


全排列:n个数全排列方案数为:(n!)

排列和组合的关系:A(n,r)可以看成是C(n,r)之后进行全排列的方案数,即A(n,r)=(r!)*C(n,r)

组合数性质

1.C(n,r)=C(n,n-r)

2.C(n,0)+C(n,1)+…C(n,n)=2n

循环排列(圆排列、环排列):

n个元素中取r个元素组成圆排列方案数:

全排列 java api 全排列组合计算公式_多重集_02


只需要把普通排列式子除以r即可,因为每种循环排列旋转之后有r种是等价的,所以把总方案数除以r

多重集的排列:

多重集即集合内有每个元素可以出现不止一次

1.若一个多重集S有k种不同的元素,每个元素可以选择无限次,则S的r-排列个数为kr(每个位置有k种选法)
2.若一个多重集S有k种不同的元素,每种元素的重数为n1,n2,…nk,设S的大小为n=n1+n2…+nk,则S的排列数有 n!/(n1!n2!n3!..nk!),因为总排列数为n!,第1种的n1个元素可以互换位置,所以要除以n1!,以此类推。

公式

全排列 java api 全排列组合计算公式_多项式_03


这个式子的另一种解释:

把集合S的排列划分成指定大小的部分后,每部分贴上标签(标签不一样)

例子:{a,b,c,d}划分成两个大小为2的集合,如果没有标签则可以划分为ab/cd,ac/bd,ad/bc
如果有标签,每个划分就变成两种了:例如ab/cd可分为 黑ab/白cd 和 白ab/黑cd

设S是一个多重集,大小为n=n1+n2+…nk,把n个元素划分成k部分,放进带标签的盒子B1,B2…Bk,其中Bi的大小为i,则方案数为n!/(n1!n2!n3!..nk!)。如果放进的是不带标签的盒子,那么方案数就是n!/(n1!n2!n3!..nk!)/k!,再除以一个k的阶乘,因为k个盒子是相同的。

多重集的组合:

设S是一个多重集,有k种不同的元素,每种元素可以取无限个,则S的r-组合的方案数为C(r+k-1,r)=C(r+k-1,k-1)
方案数即为x1+x2+…xk=r的非负整数解个数(xi表示第i个元素取的个数),可以用隔板法得出此结论。

例题:方程x1+x2+x3+x4=20的整数解有多少,其中x1>=3,x2>=1,x3>=0,x4>=5。
设yi=xi-ai,因为xi>=ai,所以yi>=0,式子就可以变成y1+y2+y3+y4=11,就变成普通题了。

二项式相关:

公式
C(n,k)=C(n-1,k)+C(n-1,k-1)
证明
C(n,k)为n个物体选k个的方案数
考虑第n个物体没有被选中,如果没选中则方案数为C(n-1,k),如果选中则方案数为C(n-1,k-1)。
常见恒等式
1.C(n,k)k=C(n-1,k-1)n
2.ΣC(n,k)(-1)n-k (k从0到n)=0,其实这个式子就是(1-1)n,即0n
3.ΣC(k,m) (k从0到n)=C(n+1,m)

多项式相关:

多项式定理:

全排列 java api 全排列组合计算公式_全排列 java api_04


全排列 java api 全排列组合计算公式_多重集_05


可用于计算多项式展开式中某一项的系数

多项式展开式中不同项的个数
设多项式为(x1+x2…+xk)n,展开式中不同项的个数其实就是n1+n2…+nk=n的非负整数解个数

组合数计算:

1.二维数组打表(适用于数据小的情况)
2.利用公式C(n,m)=n!/(m!(n-m)!),O(n)预处理阶乘,如果要取模还需要用到逆元(有一个技巧是n!的逆元就是1-n每个数逆元的前缀积对p取模,因此可以预处理所有阶乘的逆元)

大组合数取模:

卢卡斯定理模板

卢卡斯定理式子(需要递归才能实现)

全排列 java api 全排列组合计算公式_多重集_06