計算組合數

2021-06-28 00:59:17 字數 719 閱讀 8120

1.防溢位:

如果直接用c(n,m)=n!/(n-m)!*m!   來程式設計很可能會在算n!時就爆了long long,所以每一步最好把除分母也算上。

所以對於c(n,m)來說取m=min(m,n-m)來算c(n,m)=n*(n-1)*(n-2)*...*(n-m+1)/m*(m-1)*(m-2)*...*1 。顯然分子分母都是m項相乘,從後往前去算:

先算(n-m+1)/1 ,then * (n-m+2)/2  ,then....,then * n/m 這個時候也滿足每一步的相除都是整除,因為任何連續的m個整數一定會出現乙個因數m。

long long com(long long n,long long m)

同時也滿足m=0,或者n=0的情況。

如果要約定m>n或m<0 時c(n,m)=0,那上面**就要添上幾句。

2.高效:

如果多次用到連續的組合數,不用乙個乙個計算,可以用迭代計算:[i][j]=(c[i-1][j]+c[i-1][j-1])

有組合數的關係:c(i,j)=c(i-1,j)+c(i-1,j-1);所以可以時空權衡開個二維陣列儲存結果:

c[0][0]=1;

for(int i=1;i<=limax;i++)

未完待續...

計算組合數

計算組合數 time limit 1000ms memory limit 32768kb submit statistic problem description 計算組合數。c n,m 表示從n個數中選擇m個的組合數。計算公式如下 若 m 0,c n,m 1 否則,若 n 1,c n,m 1 否則...

計算組合數

time limit 1000 ms memory limit 32768 kib problem description 計算組合數。c n,m 表示從n個數中選擇m個的組合數。計算公式如下 若 m 0,c n,m 1 否則,若 n 1,c n,m 1 否則,若m n,c n,m 1 否則 c n...

計算組合數

編寫函式,引數是兩個非負整數n和m,返回組合數cnm n m n m 其中m n 25,例如,n 25,m 12時答案為5200300。很多人一看到這個題目,第一做法是編寫乙個計算階乘的函式,然後返回值。其做法如下 include long long factorial int n long lon...