UVA 10375 Choose and divide

来源:互联网 发布:2014新疆网络管制 编辑:程序博客网 时间:2024/06/03 18:04

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

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int MAXN=10000;int prime[MAXN+1];int nprime;int e[MAXN+1];//e数组储存的是各个素数对应的指数,和prime数组下标相对应void getprime(){    int m=sqrt(MAXN+0.5);    memset(prime,0,sizeof(prime));    int i,j;    for(i=2;i<=m;i++)//获得1000以内的素数    {        if(!prime[i])        {            for(j=i*i;j<=MAXN;j+=i)                prime[j]=1;        }    }    nprime=0;    for(i=2;i<=MAXN;i++)//把素数整理放到prime数组里面    {        if(!prime[i])            prime[nprime++]=i;    }}void Add_Int(int n,int d){    int i;    for(i=0;i<=nprime-1;i++)    {        while(n%prime[i]==0)//如果n为合数        {            n/=prime[i];            e[i]+=d;        }        if(n==1)break;    }}void Add_Fac(int n,int d){    int i;    for(i=1;i<=n;i++)    {        Add_Int(i,d);    }}int main(){    getprime();    int p,q,r,s;    while(~scanf("%d%d%d%d",&p,&q,&r,&s))    {        memset(e,0,sizeof(e));        Add_Fac(p,1);//1和-1为组合数公式中的幂        Add_Fac(q,-1);        Add_Fac(p-q,-1);        Add_Fac(r,-1);        Add_Fac(s,1);        Add_Fac(r-s,1);        int maxn=max(p,r);        double ans=1;        int i;        for(i=0;i<=maxn;i++)        {            ans*=pow(prime[i],e[i]);        }        printf("%.5f\n",ans);    }    return 0;}

原创粉丝点击