組合數的兩種計算方法 遞推,對數

2021-08-09 00:01:37 字數 1482 閱讀 3886

組合數

從m個不同元素中,任取n(n≤m)個元素並成一組,叫做從m個不同元素中取出n個元素的乙個組合;所有可能的組合種數就是組合數。組合數的計算公式如下圖:

式子中出現了階乘,而20!=2.4329020081766 * 1018    

這個數字已經和long long能表示的最大整數乙個數量級了,而式子是個除式,所以要想辦法在過程中把數降下來。

方法一:想到乙個組合數公式:

c(m,n)=c(m-1,n-1)+c(m-1,n)

這個式子可以這樣記憶:你從m個元素裡挑n個元素,針對第乙個元素要麼是n個裡的要麼不是,如果是的,那麼就從剩下的m-1個裡挑n-1個 就是c(m-1,n-1);如果第乙個元素不是n裡的,就從剩下的m-1個元素裡挑n個,就是c(m-1,n)。

利用這個公式,就能用遞迴的方法解決問題。注意遞迴的結束條件。

**示例:

123

4567

891011

1213

1415

1617

1819

#include

#include

using

namespace

std;

long

long

comb

(intm,

intn

)

intmain

()

來自code的**片

comb1.cpp

方法二:

因為公式右邊均為乘法,相到可以取對數將其展開。於是對公式兩遍取對數,log(c(m,n))= log( m!/(m-n)!) -log n!

於是可以直接求 log(m-n+1)+log(m-n+2)+······+log(m)  和log(1)+log(2)+······+log(n)。

注意這裡的log()和exp()函式在標頭檔案#include中,log()預設是以2為底,如果要求以a為底b的對數,可以用對數的性質轉換下

:log(a)b=logb/loga。

**示例:

123

4567

891011

1213

1415

1617

1819

2021

22

#include

#include

using

namespace

std;

double

comb_log

(intm,

intn

)//對數求法

intmain

()

return0;

}

行列式的兩種計算方法

幾何意義 體積的變換因子 所以和向量與向量的模的關係差不多 在n階行列式d中劃去任意選定的k行 k列後,餘下的元素按原來順序組成的n k階行列式m,稱為行列式d的k階子式a的余子式。如果k階子式a在行列式d中的行和列的標號分別為i1,i2,ik和j1,j2,jk。則要乘上 1 i j 如果 是按一行...

求組合數(取模)的兩種方法

兩種公式配合lucas定理使用更佳 由pascal公式,可知 beginc n k c c k c n 0 c n n 1 end 取二維陣列 tc 初始化 tc 0 0 1 打表即可。最簡單,如下 const int maxn 1005 mod 100003 int tc maxn maxn tc...

SSH的兩種組合配置方法

既可以使用 web.xml 來使 web 容器載入 spring,也可以通過 struts config.xml 來使 web 容器載入 spring。1 使用 web.xml 來使 web 容器載入 spring web.xml 通過 org.springframework.web.context...