直接求组合数再相除会溢出。所以要边乘边除,两个数同时进行。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include <algorithm>
using namespace std;
double solve(double a,int b,double c,int d)
{
int L=max(b,d);
double ans=1.0;
for(int i=0;i<L;++i)
{
if(i<b&&i<d)
ans*=(a-i)/(i+1)*(i+1)/(c-i);
else if(i<b)
ans*=(a-i)/(i+1);
else
ans*=(i+1)/(c-i);
}
return ans;
}
int main()
{
int p,q,r,s;
while(scanf("%d%d%d%d",&p,&q,&r,&s)!=EOF)
printf("%.5lf\n",solve(p,q,r,s));
return 0;
}