The binomial coefficient C(m,n) is defined as
m! C(m,n) = -------- n!(m-n)!
The Input
Input consists of a sequence of lines. Each line contains four non-negative integer numbers giving values for p , q , r , and s , respectively, separated by a single space. All the numbers will be smaller than 10,000 with p>=q and r>=s .The Output
For each line of input, print a single line containing a real number with 5 digits of precision in the fraction, giving the number as described above. You may assume the result is not greater than 100,000,000.Sample Input
10 5 14 9 93 45 84 59 145 95 143 92 995 487 996 488 2000 1000 1999 999 9998 4999 9996 4998
Output for Sample Input
0.12587 505606.46055 1.28223 0.48996 2.00000 3.99960
题意:求两个组合数相除的结果。
思路:每次判断当前ans的大小,如果小的话就乘一个,大的话就出一个,这样的话就保证不会范围。
AC代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll num[10];
int main()
{
int i,j, p,q,r,s,k,k1,k2,INF=1e9;
double ans;
bool flag1,flag2;
while(~scanf("%d%d%d%d",&p,&q,&r,&s))
{
q=min(p-q,q);
s=min(r-s,s);
ans=1;
k1=p-q;k2=r-s;
num[1]=q;num[2]=q;num[3]=s;num[4]=s;
k=q*2+s*2;
flag1=flag2=0;
while(k>0)
{
if(num[1]>0 && (ans<=INF || flag2))
{
ans*=(num[1]+k1);
num[1]--;
k--;
}
if(num[2]>0 && (ans>INF || flag1))
{
ans/=num[2];
num[2]--;
k--;
}
if(num[3]>0 && (ans<=INF || flag2))
{
ans*=num[3];
num[3]--;
k--;
}
if(num[4]>0 && (ans>INF || flag1))
{
ans/=(num[4]+k2);
num[4]--;
k--;
}
if(num[1]==0 && num[3]==0)
flag1=1;
if(num[2]==0 && num[4]==0)
flag2=1;
}
printf("%.5f\n",ans);
}
}