poj1942(求组合数)

时间:2023-03-09 20:02:56
poj1942(求组合数)

题目链接:http://poj.org/problem?id=1942

题意:实际上这道题就是求C(n+m,n)。

思路:n、m的范围在unsigned中,所以不能递推计算组合数,可以采用公式C(a,b)=a!/(b!*(a-b)!),并且拆分阶乘依次进行除法运算。我在一个地方TLE了半小时,开始怎么也想不通怎么会T,后来发现我的getc函数的形参传递的是int,这样一旦实参是int所不能表示时,传递过来的可能是负数,那么在while循环里就会出现死循环,所以就T了。写代码真的要细心一些啊QAQ。还有一个细节是输入可能出现X 0 (X>0),应该输出1,而不是结束。

AC代码:

 #include<cstdio>
#include<algorithm>
using namespace std; unsigned n,m; unsigned getc(unsigned x,unsigned y){
unsigned a=x+y,b=min(x,y);
double ans=1.0;
while(b>)
ans*=(double)(a--)/(double)(b--);
ans+=0.5;
return (unsigned)ans;
} int main(){
while(~scanf("%u%u",&n,&m),n||m)
printf("%u\n",getc(n,m));
return ;
}