POJ1492——Paths on a Grid(组合数公式)

来源:互联网 发布:java ftp断点续传 下载 编辑:程序博客网 时间:2024/06/06 19:49

题目链接

       题目意思其实就是求C(n+m,s),(s=min{m,n}).对于这种题,我也是第一次见到。意思如此直接,就是求组合数,但给定的组合数有很大,32位,所以利用杨辉三角递推是做梦了,看了别人的想法,居然是直接用组合数公式:

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

       然后一个while循环再求得的值上四舍五入就搞定了,当然数据类型要改成double,不然小数点后的数据直接被砍了,但是这种做法我有很多不能理解的,首先double除法运算会造成精度损失,但最后的结果四舍五入就把损失给弥补了。其次,就算能弥补,这样的循环也会超时啊,毕竟数据太大了。然而结果却AC了。。。。。这简直是简直了(也许我就是在一本正经的胡说八道,,,也许是我智商比较感人所以想不通吧....),麻烦看到此博客的大神给我解释一下,,,感激不尽~~~


<span style="font-size:18px;">#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>using namespace std;int main(){    long long n, m;    while(scanf("%lld%lld",&n,&m)&&(n!=0||m!=0))    {        long long s=n+m;        long long t = n<=m ? n : m;        double sum=1;        while(t>0)            sum*=(double)s--/(double)t--;        sum+=0.5;        printf("%lld\n",(long long)sum);    }    return 0;}</span>


0 0