UVa 10375 - Choose and divide (分解质因子,组合数相除)

22 篇文章 0 订阅

题意:

已知p,q,r,s。求C(p,q) / C(r,s)。


算法:

利用组合数的计算公式

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

可以得到C(p,q)  = p!/(q!*(p-q)!) * = p*(p-1)*(p-2)*...*(p-q+1)/q!

C(r,s) = r!/(s!*(r-s)!) = r*(r-1)*(r-2)*...*(r-s+1)/s!

C(p,q) / C(r,s) = p*(p-1)*(p-2)*...*(p-q+1)*s!/ [r*(r-1)*(r-2)*...*(r-s+1)*q!]


把分子分母中的每个数分解质因子,分子中的数分解的质因子对应个数+1,分母中的-1。

这实际上就是一个约分的过程。


然后计算最后结果,对于所有的质因子,如果个数>0,则乘;个数<0,则除。


===========================================================

一般处理组合数学问题的策略就是能约分的先约分,能化简的先化简,能除的先除,

不要全部乘起来再除掉

思路来源于http://www.cnblogs.com/scau20110726/archive/2013/02/04/2892324.html

这篇题解写得好赞~\(≧▽≦)/~


#include<cstdio>
#include<iostream>
#include<cstring>
#define maxn 10005

using namespace std;

int c[maxn];

void solve(int x,int f)
{
    for(int i=2;x>1;i++)
    {
        if(x%i==0)
        {
            while(x>1 && !(x%i))
            {
                c[i]+=f;
                x/=i;
            }
        }
    }
}

int main()
{
    int p,q,r,s;
    while(scanf("%d%d%d%d",&p,&q,&r,&s)!=EOF)
    {
        memset(c,0,sizeof(c));
        for(int i=p;i>=p-q+1;i--)
            solve(i,1);
        for(int i=s;i>=1;i--)
            solve(i,1);
        for(int i=r;i>=r-s+1;i--)
            solve(i,-1);
        for(int i=q;i>=1;i--)
            solve(i,-1);
        double ans = 1;
        for(int i=2;i<=maxn;i++)
        {
            if(c[i]>0)
            {
                for(int j=1;j<=c[i];j++)
                    ans*=i;
            }
            else
            {
                c[i] = -c[i];
                for(int j=1;j<=c[i];j++)
                    ans/=i;
            }
        }
        printf("%.5lf\n",ans);
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值