UVA10375 Choose and divide 组合数 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

   

    题意很简单,求两个组合数相除,数字有点大,想要直接求是不可能的,只能想办法化简或者其它办法,基础可能打的不是很结实,一开始想不出,有点想要把除法变成乘法,然后约分,这样不太现实,万一p,q很大,r,s很小还是有可能超的,感觉这道题目比较好的,思路有点活,最后想出来还是觉得题目比较奇妙的,题目给的

    m!

    C(m,n) = -------------

    n!(m-n)!

    事实上在看白书的时候里面数学基础知识那里有个介绍的,还可以写成

    m*(m-1)*(m-2)...(m-n+1)

    C(m,n) = ------------------------------------

    n!

    然后进一步我们可以发现,观察一下,分母阶乘化简开来,项数为n项,分子我们仔细看看,从m乘到(m-n+1),实际上项数(m-(m-n))也就是n项,意思是这个分式的分子项数 和分母项数是一样的,那么就可以利用一乘一除的方法来进行求解了,

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #define ll long long

    #define eps 1e-8

    #define inf 0xfffffff

    const ll INF = 1ll<<61;

    using namespace std;

    /ector > G;

    /pedef pair P;

    /ector > ::iterator iter;

    //

    //mapmp;

    //map::iterator p;

    //

    int main()

    {

    int p,q,r,s;

    while(scanf("%d %d %d %d",&p,&q,&r,&s)==4)

    {

    int max1=max(p-q,q);

    int max2=max(r-s,s);

    int maxn=max(max1,max2);

    double ans=1.00000;

    for(int i=1;i<=maxn;i++)

    {

    if(i<=max1)

    ans=ans/i*(p-max1+i);

    if(i<=max2)

    ans=ans/(r-max2+i)*i;

    }

    printf("%.5lf\n",ans);

    }

    return EXIT_SUCCESS;

    }<,int><,int>

最新文章