Choose and divide UVA

Choose and divide UVA - 10375 

The binomial coefficient C(m, n) is defined as C(m, n) = m! (m − n)! n!

Given four natural numbers p, q, r, and s, compute the the result of dividing C(p, q) by C(r, s).

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.

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

Sample Output

0.12587

505606.46055

1.28223

0.48996

2.00000

3.99960

题解:刘汝佳p317

AC代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
const int maxn=10005;
int e[maxn];
int prime[maxn];
bool is_prime[maxn];
int cnt=0;
void sieve()
{
    for(int i=0;i<maxn;i++)
        is_prime[i]=true;
    is_prime[0]=is_prime[1]=false;
    for(int i=2;i<maxn;i++)
        if(is_prime[i])
        {
            prime[cnt++]=i;
            for(int j=2*i;j<maxn;j+=i)
                is_prime[j]=false;
        }
}

void add_integer(int n,int d)
{
    for(int i=0;i<cnt;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;
    sieve();
    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<cnt;i++)
        {
            ans*=pow(prime[i],e[i]);
        }
        printf("%.5lf
",ans);
    }
    return 0;
}

今天也是元气满满的一天!good luck!