poj1942(求组合数)
Posted frankchen831x
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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代码:
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 5 unsigned n,m; 6 7 unsigned getc(unsigned x,unsigned y){ 8 unsigned a=x+y,b=min(x,y); 9 double ans=1.0; 10 while(b>0) 11 ans*=(double)(a--)/(double)(b--); 12 ans+=0.5; 13 return (unsigned)ans; 14 } 15 16 int main(){ 17 while(~scanf("%u%u",&n,&m),n||m) 18 printf("%u ",getc(n,m)); 19 return 0; 20 }
以上是关于poj1942(求组合数)的主要内容,如果未能解决你的问题,请参考以下文章
poj1942 Paths on a Grid(无mod大组合数)
[ACM] POJ 1942 Paths on a Grid (组合)