大意:矩形方格,从左下角走到右上角,只能向上或向右,问一共有多少种情况。
思路:排列组合,每一个点的不同走法的总数,是由左边的点和下边的点的总数之和,这就很容易联想到排列组合的一个公式:,其中,n为走到这点所总共经过的边数(不分横边竖边),r可以看为已经走过的横边或者竖边。即有n = a + b,r = a 或者 r = b。
#include <map> #include <stack> #include <queue> #include <math.h> #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #define LL long long using namespace std; LL C(LL x, LL y) ///求组合数 { LL i, j, sum = 1; if(y > (x/2)) y = x-y; for(i = x, j = 1; i > x-y; i--, j++) { sum *= i; sum /= j; } return sum; } void run() { LL n, m; while(~scanf("%lld%lld", &n, &m)) { if(!n && !m) break; LL t = n+m; printf("%lld\n", C(t, n)); } } int main(void) { run(); return 0; }