题意:已知C(m,n)=m! / (n!*(m-n!)),输入整p,q,r,s(p>=q,r>=s,p,q,r,s<=10000),计算C(p,q)/C(r,s)。输出保证不超过10^8,保留5位小数
分析:初步分析,本题时间上基本上没有太大的限制,可以暴力求解C(m,n);
但是我们会发现C(10000,5000),早已超出了计算机整数的表示范围,不过输出保证了不超过10^8,所以本题我们使用唯一分解定理进行求解,通过将其分解为指数幂次相乘的形式即可。
代码如下:

//
//Created by BLUEBUFF 2016/1/11
//Copyright (c) 2016 BLUEBUFF.All Rights Reserved
//

#pragma comment(linker,"/STACK:102400000,102400000")
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//#include <ext/pb_ds/hash_policy.hpp>
//#include <bits/stdc++.h>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdio>
#include <time.h>
#include <cstdlib>
#include <cstring>
#include <complex>
#include <sstream> //isstringstream
#include <iostream>
#include <algorithm>
using namespace std;
//using namespace __gnu_pbds;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int, LL> pp;
#define REP1(i, a, b) for(int i = a; i < b; i++)
#define REP2(i, a, b) for(int i = a; i <= b; i++)
#define REP3(i, a, b) for(int i = a; i >= b; i--)
#define CLR(a, b) memset(a, b, sizeof(a))
#define MP(x, y) make_pair(x,y)
template <class T1, class T2>inline void getmax(T1 &a, T2 b) { if (b>a)a = b; }
template <class T1, class T2>inline void getmin(T1 &a, T2 b) { if (b<a)a = b; }
const int maxn = 10010;
const int maxm = 1e5+5;
const int maxs = 10;
const int maxp = 1e3 + 10;
const int INF  = 1e9;
const int UNF  = -1e9;
const int mod  = 1e9 + 7;
const int rev = (mod + 1) >> 1; // FWT
const double PI = acos(-1);
//head

bool vis[maxn];
int prime[maxn], rear;
void getprime(){
    memset(vis, 0, sizeof(vis));
    int m = sqrt(maxn);
    for(int i = 2; i <= m; i++){
        if(!vis[i]){
            for(int j = i * i; j < maxn; j += i){
                vis[j] = 1;
            }
        }
    }
    rear = 0;
    for(int i = 2; i < maxn; i++){
        if(!vis[i]){
            prime[rear++] = i;
        }
    }
}
int e[maxn];
void add_integer(int n, int d){
    for(int i = 0; i < rear; i++){
        while(n % prime[i] == 0){
            n /= prime[i];
            e[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()
{
    int p, q, r, s;
    getprime();
    while(cin >> p >> q >> r >> s){
        memset(e, 0, sizeof(e));
        add_factorial(p, 1);
        add_factorial(q, -1);
        add_factorial(p - q, -1);
        add_factorial(r, -1);
        add_factorial(s, 1);
        add_factorial(r - s, 1);
        double ans = 1;
        for(int i = 0; i < rear; i++){
            ans *= pow(prime[i], e[i]);
        }
        printf("%.5f\n", ans);
    }
}