• 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!

  • 相关阅读:
    ➡️➡️➡️IELTS reading by Simon on Bili
    lc0502
    lc0331
    lc0329
    lc0327
    lc0326
    lc0324
    lc0320
    lc0319
    lc0316
  • 原文地址:https://www.cnblogs.com/cattree/p/7636554.html
Copyright © 2020-2023  润新知