本文共 983 字,大约阅读时间需要 3 分钟。
给你一个n*m的矩阵,最开始在左上角,只能向下或者向右,求,从左上走到右下的所有路线的方案数。
不难发现,需要走n+m步,然后从n+m中挑出n个走下,即答案就是 C m + n n C_{m+n}^{n} Cm+nn但是!
本题的询问较多,且差距较大,是无法通过递推得到的。 所以就要利用一种求单个组合数的方法。C n k C_{n}^{k} Cnk的本质是 Π n − k + 1 n \Pi_{n-k+1}^{n} Πn−k+1n ÷ \div ÷ Π 1 k \Pi_{1}^{k} Π1k
所以我们把它当成k个 分数 乘起来就好了。(分子分母分别乘可能会爆longlong) 即ans= n k ∗ n − 1 k − 1 ∗ n − 2 k − 2 ∗ . . . ∗ n − k + 1 1 \cfrac{n}{k}*\cfrac{n-1}{k-1}*\cfrac{n-2}{k-2}*...*\cfrac{n-k+1}{1} kn∗k−1n−1∗k−2n−2∗...∗1n−k+1 由于浮点数可能会产生误差,所以最终结果要加上0.5再取整#include#include #include using namespace std;int n,m;unsigned calc(unsigned n,unsigned m){ double ans=1.0,a=(double)m+n,b=(double)min(n,m); while(b){ ans*=a/b; a--;b--; } ans+=0.5; return (unsigned)ans;}int main(){ while(~scanf("%d%d",&n,&m)){ if(!m&&!n) break;//结束条件 printf("%u\n",calc(n,m)); } return 0;}
芭芭拉冲鸭!
转载地址:http://luuci.baihongyu.com/