排列與組合是最基本的計數技巧。本節介紹一些基本的相關知識和方法
加法原理。做一件事有n個辦法,第i個辦法有pi種方案
乘法原理。做一件事情有n個步驟
容斥原理。(概率論求和的公示)
有重複元素的全排列。有k個元素,其中有k個元素,其中第i個元素有ni個,求全排列個數
分析:
令所有ni之和爲n,再設答案爲x,首先做全排列,然後把所有元素編號,其中第S種元素的編號爲1~ns。這樣由於編號後所有元素均不同,方案總數爲n的全排列數爲n!.根據懲罰原理得到一個方程:n1! n2!......nk! x!=n!,後移項即可
可重複選擇的組合。有n個不同元素,每個元素可以選多次,一次選k個元素,有多少種方法?
分析:
設第i個元素選xi個,問題轉化爲求方程x1+x2+...+xn=k的非負整數解的個數,令yi=xi+1,則答案爲y1+y2...+yn=k+n的正整數的個數
C(k+n-1,n-1)=C(n+k-1,k)
10.2.1楊輝三角與二項式定理
給定n,如何求出(a+b)^n中所有項的係數呢?一個方法是用遞推,根據楊輝三角中不難發現規律
memset(C,0,sizeof C);
for(int i=0;i<=n;i++){
C[i][0]=1;
for(int j=1;j<=i;j++)
C[i][j]=C[i-1][j-1]+C[i-1][j];
}
時間複雜度爲n*n
另一個方法是利用等式。。從左到右遞推
C[0]=1;
for(int i=1;i<n;i++) C[i]=C[i-1]*(n-i+1)/i;
注意,應該先乘後除,避免非整數溢出
10.2.2數論中的計數問題
問題!小於n且與n互素的整數個數。
。。。。。。
10.2.3編碼與解碼
兩個a,一個b和一個c組成的所有串可以按照字典序編號爲:
aabc(1),aacb(2),,,,,,,cbaa(12)
任給一個字符串,能否方便地求出他的編號?
10.2.4離散概率初步
關於概率有一套很深的理論,不過很多和概率相關的問題並不需要特別的知識,熟悉排列組合就夠了
注意double型的溢出,可以變成邊除,以及全概率公式的應用