【题解】UVa 10375【 Choose and divide】

背景

这题是关于组合数的,听说他们用唯一分解定理写的,但是我好像发现组合数是可以边乘边除的哈哈。这样就是水题。

分析

对于$C(m,n)=\frac{m!}{(m-n)!n!}$,分母有$m$项,显然分子有$m-n+n$项,即上下项数相等,当两个组合数相除时,这个性质也满足,所以可以边乘边除。

代码

#include<cstdio>

inline int max(int a,int b){return a > b ? a : b;}

int main(){
    int p,q,r,s;
    while(scanf("%d %d %d %d",&p,&q,&r,&s) != EOF){
        double ans = 1.00000;
        int max1 = max(p - q,q);
        int max2 = max(r - s,s);
        int max3 = max(max1,max2);
        for(int i = 1;i <= max3;i++){
            if(i <= max1) ans = ans / i * (p - max1 + i);
            if(i <= max2) ans = ans / (r - max2 + i) * i;
        }
        printf("%.5lf\n",ans);
    }
    return 0;
}