組合數學相關

2021-10-16 13:02:53 字數 3240 閱讀 6938

1、排列數( a(n,m) )

從n個不同元素種取出m(m≤n)個元素的所有不同排列的個數,叫做從n個不同元素種取出m個元素的排列數,用a(n,m)表示。

排列數公式

a(n,m) =n (n−1) (n−2) ⋯ (n−m+1) = n! / (n−m)!, n,m∈n+,並且m≤n

(規定0!=1)

推導:把n個不同的元素任選m個排序,按計數原理分步進行

取第乙個:有n種取法;

取第二個:有(n−1)種取法;

取第三個:有(n−2)種取法;

……取第m個:有(n−m+1)種取法;

根據分步乘法原理,得出上述公式。

排列數性質

a(n, m) = na(n−1, m−1) : 可理解為「某特定位置」先安排,再安排其餘位置。

a(n, m) = ma(n−1, m−1) + a(n−1, m) 可理解為:含特定元素的排列有ma(n−1, m−1),不含特定元素的排列為a(n−1, m)。

ll inv[maxn * maxn]

,fac[maxn * maxn]

;void

init()

inv[1]

=1;for

(int i=

2;i<=n;i++

) inv[0]

=1;for

(int i=

1;i<=n;i++)}

ll c

(ll n,ll m)

ll a

(ll n,ll m)

如果需要列印或者需要用到產生的排序序列,可以使用dfs的方法進行搜尋,設定乙個變數wei,用來表示已經排好了幾位,wei從0開始,如果wei == m,說明已經排好了m個數,輸出就好了,具體**如下:

計算a(3,2):

3 26

1 21 3

2 12 3

3 13 2

int vis[

10001];

//檢視該數字是否被訪問過

int ans[

10001];

//儲存已經排好位序的數

voida(

int n,

int m,

int wei)

cout << endl;

}else}}

}

2、可重排列數
從 n 個物品中可重複的取 m 個物品,情況種類是 nm;

第一次取可能的選擇有 n 種;

第二次取可能的選擇有 n 種;

……第m次取可能的選擇有 n 種;

所以總共的情況種類有 nm種。

3、圓排列

首先從n個物品中選出m個物品,情況可能的種類有c(n,m),然後對這選出來的m個物品進行全排列 a(m,m) = m!,因為要保證連成乙個環之後不能重複,以123為例,123,231,312都是同一組圓排列,所以每三組便能總結成為一組,同理可知m個物品的全排列每m組便只有一組是有效的,其餘的(m-1)組都是重複的,所以有效的種類數有 m! / m = (m-1)!,綜上所述,從n數中選取m個數進行圓排列的情況種類有 c(n,m) * (m-1)! = a(n,m)/m

long

long

circular

(int n,

int m)

return sum/m;

//return a(n,m)/m;

}

4、不盡相異元素全排列
如果在 n 個元素中有 n1 個元素相同,又有 n2 個元素相同,……又有 nm 個元素相同(n1 + n2 + …… + nm

<= n),那麼把這 n 個元素進行排列的種類有:

1、組合數

//原始的**

long

longc(

int a,

int n,

int mod)

return ans;

}

//高階版

ll inv[maxn * maxn]

,fac[maxn * maxn]

;void

init()

inv[1]

=1;for

(int i=

2;i<=n;i++

) inv[0]

=1;for

(int i=

1;i<=n;i++)}

ll c

(ll n,ll m)

ll a

(ll n,ll m)

//預處理好資料直接呼叫

ll inv[maxn * maxn]

,fac[maxn * maxn]

;void

init()

inv[1]

=1;for

(int i=

2;i<=n;i++

) inv[0]

=1;for

(int i=

1;i<=n;i++)}

ll c

(ll n,ll m)

ll a

(ll n,ll m)

組合數相應的一些性質:

2、可重組合數

真的是被這個問題困擾了快一天(瑟瑟發抖),一共有三個問題情境,先說乙個我個人認為比較好入手的點吧:

①從n個數中選擇r個數,每次選擇的數可以重複,一共有多少種可能的情況?

組合數學 求組合數

對於求組合數,要根據所給資料範圍來選擇合適的演算法 這道題中所給的資料範圍適合用打表的方法直接暴力求解 先用4e6的複雜度預處理出所有的情況,再用1e4的複雜度完成詢問即可 include using namespace std const int n 2010 const int mod 1e9 ...

數學 組合數學

mod must be a prime const int mod 1e9 7 namespace combinatory ll inv ll x ll fac maxn invfac maxn void initc int n ll a ll n,ll m ll c ll n,ll m ll d ...

組合數學筆記

從n個數中選m個數,每個數至多選一次,方案數 性質 c n,0 c n,n 1 c n,m c n,n m c n,m c n 1,m 1 c n 1,m 楊輝三角 二項式展開 x y n i 0.n c n,i x iy n i 那這裡先說一下楊輝三角 前提 每行端點與結尾的數為1 每個數等於它上...