标签:组合数
Description
Input
Output
Sample Input
5 4 1 1 0 0
Sample Output
126 2
题意:给出一个n*m 的方格,问从左下方走到右上方共有多少种走法。
思路:其实你不管怎么走,你走的总步数肯定是n+m步,选取了横向的n步,那么纵向的也就确定了,所以结果为n+m步里取出n步的所有组合数。
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set> #include <queue> #include <stack> #include <map> using namespace std; typedef long long LL; const int inf=0x3f3f3f3f; const double eps=1e-10; const double pi= acos(-1.0); const int MAXN=31269; //下面是一个O(n)的求组合数的方法。 LL C(LL n,LL m) { if(m>n/2) m=n-m; LL a=1,b=1; for(int i=1;i<=m;i++){ a*=n-i+1; b*=i; if(a%b==0){ a/=b; b=1; } } return a/b; } int main() { LL n,m; while(~scanf("%lld %lld",&n,&m)){ if(!n&&!m) break; printf("%lld\n",C(n+m,n)); } return 0; }
POJ 1942-Paths on a Grid(组合数学)
标签:组合数
原文地址:http://blog.csdn.net/u013486414/article/details/46124367