分子分母分别分解成素数的乘积,先约分,后计算
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn= 10000+10;
int a[maxn], pri[maxn],num[maxn];
int cnt=0;
void get_maxn(){
for(int i =2,temp;i<maxn;i++){
if(a[i]==0){
pri[cnt++]=i;
temp=i*i;
while(temp<maxn){
a[temp]=1;
temp+=i;
}
}
}
return;
}
void add_integer(int n,int d){
for(int i=0; i< cnt;i++){
while(n % pri[i] == 0){
n /= pri[i];
num[i] += d;
}
if(n==1) break;
}
}
void add_factorial(int n, int d){
for(int i = 1;i <= n; i++){
add_integer(i,d);
}
}
int main(){
get_maxn();
int p,q,r,s;
while(scanf("%d%d%d%d",&p,&q,&r,&s)!=EOF){
memset(num,0,sizeof(num));
add_factorial(p,1);
add_factorial(s,1);
add_factorial(r-s,1);
add_factorial(q,-1);
add_factorial(p-q,-1);
add_factorial(r,-1);
double n=1;
for(int i=0;i<cnt; i++){
while(num[i]>0){
n*=(double)pri[i];
num[i]--;
}
while(num[i]<0){
n/=(double)pri[i];
num[i]++;
}
}
printf("%.5f\n",n);
}
return 0;
}