从n个数中选出m个的方案数称为n的m的组合数,下面是可以求出long long 范围内的组合数模板。
主要思想就是利用double 求出近似的数值,最后约分。
long long fun(double n,double m)
{
double s=1.0;
while(m>0)
{
s*=(n--)/(m--);
}
s+=0.5; //防止有精度损失而造成的误差.
return (long long)s;
}
例题:
Description
One company of IT City decided to create a group of innovative developments consisting from 5 to 7 people and hire new employees for it. After placing an advertisment the company received n resumes. Now the HR department has to evaluate each possible group composition and select one of them. Your task is to count the number of variants of group composition to evaluate.
Input
The only line of the input contains one integer n (7 ≤ n ≤ 777) — the number of potential employees that sent resumes.
Output
Output one integer — the number of different variants of group composition.
Sample Input
7
29
利用上述模板直接求:
#include<stdio.h>
#include<string.h>
int vis2[800];
long long fun(double n,double m)
{
double s=1.0;
while(m>0)
{
s*=(n--)/(m--);
}
s+=0.5;
return (long long)s;
}
int main()
{
double n,k=5,s;
long long sum=0;
scanf("%lf",&n);
sum+=(fun(n,5)+fun(n,6)+fun(n,7));
printf("%lld\n",sum);
return 0;
}