注解
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;
}