题目意思其实就是求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>