POJ 1942 Paths on a Grid(求组合数)

POJ 1942 Paths on a Grid

题目大意

给定n,m (n,m232) Cnn+m

分析

裸的求组合数的题

原公式是:

Cmn=AmnAmm=n!m!(nm)!=n(n1)...(nm+1)m!=n(n1)...(m+1)(nm)!

不能直接阶乘后做除法会溢出

百度后总结一下求组合数的几种方法(组合数combinatorial number)

1.递推法

可以通过公式:

Cmn=Cm1n+Cm1n1

递推求出,但是对于n太大的情况就不适用了

2.取对数法

为了避免直接计算n的阶乘,对公式两边取对数,于是得到:

ln(Cmn)=ni=1ln(i)mi=1ln(i)nmi=1ln(i)

通过取对数将连乘转化成了连加

化简一下得到: ln(Cmn)=ni=m+1ln(i)nmi=1ln(i)

之后 Cmn=expln(Cmn)

3.拆分阶乘

这个方法其实把阶乘拆分成若干分式后用double来做
需要注意的是精度的处理问题
直接看题解了
知道做法后这道题还是挺水的

代码

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
#define uint unsigned int
uint Comb(uint n,uint m)//¼ÆËã×éºÏÊý
{
    uint a=n+m;
    uint b=min(n,m);
    double ans=1.0;
    while(b>0)
    {
        ans=ans*((double)(a--)/(double)(b--));

    }
    ans+=0.5;
    return (uint)ans;
}
int main()
{
    uint n,m;
    while(scanf("%u%u",&n,&m)!=EOF)
    {
         if(n==0 && m==0)break;
         cout<<Comb(n,m)<<endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值