需要熟悉组合数的代码,可以快速做出来,所以先做个笔记。
有两种代码实现
代码1;直接按照C(n, m) = (m * m - 1 * m - 2 * m - 3 * m - 4 * … * m - n + 1) / n!
因为从m到m - n + 1, 共需要进行m - m + n - 1 = n - 1次的加,而从1加到n,也需要n - 1次加,所以一个循环就可以。
//依托公式:C(n, m) = m * (m - 1) * .... * (m - n + 1) / n !
__int64 Cc(int n, int m) {
__int64 s = 1;
for(int i = m,j = 1; i >= m - n + 1; i--, j++) {
s *= i, s /= j;
}
return s;
}
代码2;按照《算法竞赛入门》提供的思路
//依托公式:C(n, m) = m! / n ! * (m - n)!
//其中有m!/n!,等于m * m - 1 * ... * n + 1
__int64 cC(int n, int m) {
if((m - n) > n) {
n = m - n;
}
__int64 s = 1;
for(int i = n + 1; i <= m; i++) {
s *= i;
}
for(int i = m - n; i >= 1; i--) {
s /= i;
}
return s;
}