杭电 2200 Eddy's AC难题 (排列组合 公式)用double来表示64位

Eddy‘s AC难题

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3710    Accepted Submission(s): 1741

Problem Description

Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的ac题目的数量摘录下来,然后从中选择一部分人(或者全部)按照ac的数量分成两组进行比较,他想使第一组中的最小ac数大于第二组中的最大ac数,但是这样的情况会有很多,聪明的你知道这样的情况有多少种吗?

特别说明:为了问题的简化,我们这里假设摘录下的人数为n人,而且每个人ac的数量不会相等,最后结果在64位整数范围内.

Input

输入包含多组数据,每组包含一个整数n,表示从Ranklist上摘录的总人数。

Output

对于每个实例,输出符合要求的总的方案数,每个输出占一行。

Sample Input

2
4

Sample Output

1
17

Author

Eddy

思路:

要是想求出总种类数,可以选择插板法。设总共有n个数字,从中选取m个数字(n>=m>=2),那么就相当于在m个数中插板,总共有m-1种可能,从总数为n的抽取m个有排列组合公式的等于Cnm=n!/(m!*(n-m)!);

体会:

用double 来表示64位 最后用.0lf用的特好。特舒服。

运用到的知识点:

Double 变量以带符号的
IEEE 64 位(8 个字节)双精度浮点数形式存储,负值取值范围为 -1.79769313486231570E+308 到 -4.94065645841246544E-324,正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。

代码如下:

#include<stdio.h>
double c(double a)
{
	double s=1,i;
	for(i=1;i<=a;i++)
	s*=i;
	return s;
}
double f(double n,double i)
{
	return c(n)/(c(n-i)*c(i));
}
int main()
{
	double n,i,sum;
	while(~scanf("%lf",&n))
	{
		sum=0;
		for(i=2;i<=n;i++)
		sum+=(i-1)*f(n,i);
		printf("%.0lf\n",sum);
	}
	return 0;
}

杭电 2200 Eddy's AC难题 (排列组合 公式)用double来表示64位,布布扣,bubuko.com

杭电 2200 Eddy's AC难题 (排列组合 公式)用double来表示64位

时间: 2024-11-06 23:05:00

杭电 2200 Eddy's AC难题 (排列组合 公式)用double来表示64位的相关文章

hdu 2200 Eddy&#39;s AC难题 (排列组合 就是求(a+b)的n次方的展开式)

Eddy's AC难题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3770    Accepted Submission(s): 1765 Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的

Hdoj 2200 Eddy&#39;s AC难题 【数学】

Eddy's AC难题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4198 Accepted Submission(s): 1967 Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的ac题目的数

hdu 2200 Eddy&#39;s AC难题

Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的ac题目的数量摘录下来,然后从中选择一部分人(或者全部)按照ac的数量分成两组进行比较,他想使第一组中的最小ac数大于第二组中的最大ac数,但是这样的情况会有很多,聪明的你知道这样的情况有多少种吗? 特别说明:为了问题的简化,我们这里假设摘录下的人数为n人,而且每个人ac的数量不会相等,最后结果在64位整数

HDU ACM 2200 Eddy&#39;s AC难题

解析: 1.可以从中任选m个人(n=>m>=2),有Cn(m)中选择; 2.再把这m个人分2组(每个人都要分组),要使满足最小ac数大于最大ac数,只需要在m个人中插板即可: 例如: m个人假如分别为 : 1,2,3,4,......m-1,m (m个人的ac数从小到大排列) 只需在任意位置插板就可分为符合要求的2组: 1,2,3......t, || t+1...m-1,m (1<=t<m) 则 1,2,3......t 为一组 t+1,t+2,......m-1,m 为一组 3

hdu 2200 Eddy&#39;s AC难题(简单数学。。)

题意: N个人,每个人AC的题数都不一样. Eddy想从中选出一部分人(或者全部)分成两组.必须满足第一组中的最小AC数大于第二组中的最大AC数. 问共有多少种不同的选择方案. 思路: 简单数学.. 代码: ll C(int n,int x){ ll ans=1; rep(i,1,x){ ans = ans*(n+1-i)/i; } return ans; } int main(){ int n; while(cin>>n){ ll ans = 0; rep(i,2,n){ ans += (C

杭电ACM1210——Eddy&#39;s 洗牌问题~~找规律。

例如:n = 3 一开始,序列为1 2 3 | 4 5 6 然后序列为        4 1 5 | 2 6 3 接着为                2 4 6 | 1 3 5 最后为                1 2 3 | 4 5 6 所以m = 3. 找出规律就可以解决了,只需要第一个数,也就是1的位置重新回到位置1,那整个数列就变回开始的序列了. 1的位置 i 小于等于n时,下一个位置是 2 * i :i 大于 n 时,下一个位置是 2 * (i - n)- 1. 下面是AC的代码

杭电ACM1162——Eddy&#39;s picture~~最小生成树

这一题,就是简单的最小生成树的应用.开始,没有想到用最小生成树做,想到的是贪心,当知道了用最小生成树做的时候,还犯了一个很严重的错误,就是时间复杂度的估计错了,导致开始不敢写,在想其他的办法.当作一次教训吧. 下面是AC的代码,有详细的注释,用的是并查集来判环,时间复杂度为nlogn,主要时间在排序上. #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> us

杭电ACM1163——Eddy&#39;s digital Roots

这题主要是找规律,第一次找出来!~~ 题目的意思是求一个数的digital root,这个所谓的digital root也就是一个数的各位数之和,如果这个数的两位数以上,重复再算digital root,直到这个数是一位数. 这一题就是求n^n的digital root. 规律如下: n个n相乘的结果假设为S,S的digital root 等于这n个数的digital root的相乘. 下面的是AC的代码,很简单的: #include <iostream> using namespace st

HDU2220 Eddy&#39;s AC难题

Eddy's AC难题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3605    Accepted Submission(s): 1684 Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的