http://poj.org/problem?id=1942
题意 :在一个n*m的矩形上有n*m个网格,从左下角的网格划到右上角的网格,沿着边画,只能向上或向右走,问有多少条不重复的路 。
思路 :这种问题记得高中的时候就做过,学组合数的时候讲的,反正就是向上向右走,加起来要走的路必定为n+m条,选择n条向上,必定剩下的m为向右的,所以这个题就转化求C(n,m+n),或者是C(m,m+n),不过个人建议用m,n中小的那个数去做,因为省时。因为这个数据较大,所以求组合的时候就要注意以防超时,如果还像1850那样用杨辉三角就容易超时了,就要用另一种方法去求组合数,我以前整理过4种求组合数的方法,正好第四种这里可以用,拆分相除,逐项相乘。
#include <iostream> #include <stdio.h> #include <math.h> #include <iomanip> using namespace std ; double com(unsigned n,unsigned m) { unsigned a = m+n ; unsigned b = min(m,n) ; double comm = 1.0 ; while(b > 0) comm *= (double)(a--)/(double)(b--) ; return comm ; } int main() { unsigned m,n ; while(scanf("%d %d",&m,&n)&&(m||n)) { cout<<fixed<<setprecision(0)<<com(n,m)<<endl ; } return 0 ; }