一、原题题目
题目跳转链接在这里:https://www.acwing.com/problem/content/824/
二、解题思路
刚一看,蒙了,再一看,这不高中时的排列组合经典题目嘛,然后赶紧去百度了一下排列组合的公式,来回忆回忆:
嗯嗯,就是这两个公式,都给忘完了,也怪当时没学好,哈哈。
这样看来,我们这样解读题目:我们一共需要走 n+m 步,其中有 n 步是向下走的,那么 C(n+m, n) 就是题目所求不同的走法总数目。
注意: C(n+m, n) = (n+m)! / (n!m!) = (n+m)(n+m-1)…(m+1)/n!
当要除以 n 的阶乘的时候,要分 n 次除,防止溢出。
三、代码实现
// 换一种问法:一共需要走 m+n 步,其中有 n 步向下走,问有多少种走法
// 也就是排列组合:C m+n n = (m+n)! / (n!*(m+n-n)!) = (m+n)*(m+n-1)*...*(m+1)/n!
#include <stdio.h>
int main()
{
int n, m, res=1;
scanf("%d%d", &n, &m);
int i = m+1,j = 2 ;
for (; i <= m+n; i ++){
res *= i; //计算(n+m)*(n+m-1)*...*(m+2)*(m+1)
while (j <= n && res % j == 0){ //除以n!(分开n次除是为了防止溢出)
res /= j;
j ++;
}
}
printf("%d", res);
return 0;
}
编译运行,结果正确:
四、题目总结
从高中的时候,我这排列组合就是一知半解的状态,早都想再复习一下了,奈何看不下去呀😂,以后再有题目再说吧。。。