关于计算组合数的笔记

需要熟悉组合数的代码,可以快速做出来,所以先做个笔记。
有两种代码实现
代码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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Greatljc

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值