我們知道組合的公式長這樣 :
$$C(m,n)=\frac{m!}{n!(m-n)!}$$但若直接照這個公式寫程式可能會有問題,比如 \(C(49,6)\) 就需要計算 \(49!\) 這會是一個很大的數字,所以實際寫程式要利用分母殺掉分子的特性優化它。
首先,組合有一個特性,那就是 :
舉例 : \(C(10,7) = C(10,3)\),因為這兩段表示方式分母都是 \(7! \times 3!\)。以這個例子來說,為了可以殺更多的分子會選 \(C(10,3)\) :
$$C(10,3) = \frac{10!}{3!(10-3)!} = \frac{10!}{3!7!} = \frac{10\times9\times8}{3\times2\times1}$$註🤔 : 當然,如果是人工計算可以輕易的辨識要拿誰殺, 但寫程式必須明確知道是誰被殺
程式如下
long long fn(int m,int n){
long long result = 1;
if(m-n < n)n = m-n;
for(int i=1 ; i <= n ; ++i){
result *= m--;
result /= i;
}
return result;
}