【组合数+隔板法】HDU-2200 Eddy's AC难题

在这里插入图片描述

注解

1、一定要注意精度!题目说最后结果在64位范围内。本题用long long int也会Wrong Answer!必须用double类型。
2、题目本质是组合数的和。如输入n=4,则是求C(4, 1)(1-1) + C(4, 2)(2-1) + C(4, 3)(3-1) + C(4, 4)(4-1)。
翻译一下就是:从列表中的人中选出i个,由小到大先排好序,然后对这i个人用隔板法,也就是有i-1个隔板的取法,因此取i个人的符合题意的总个数就是C(n, i) * (i-1)。然后i从1到n,求和就是答案。

代码

#include <iostream>

using namespace std;

//计算从m到n的乘积 
double multiple(int n, int m){
	double sum = 1;
	for(int i=m+1; i<=n; i++){
		sum *= i;
	}
	return sum;
}

double c(int n, int m){ //计算C(n,m) 
	double fac1 = multiple(n, m); // 计算n!/m!,也就是m*(m+1)*...*n 
	double fac2 = multiple(n-m, 1); //计算(n-m)! 
	return fac1/fac2;
}

int main() {
	
	int n;
	while(scanf("%d", &n)==1){
		double ans = 0;
		for(int i=1; i<=n; i++){
			ans += c(n, i) * (i-1);
		}
		printf("%.0lf\n", ans);
	}
	
	return 0;
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值