AcWing-822. 走方格(排列组合)


一、原题题目

在这里插入图片描述
题目跳转链接在这里: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;
}

编译运行,结果正确:
在这里插入图片描述

四、题目总结

从高中的时候,我这排列组合就是一知半解的状态,早都想再复习一下了,奈何看不下去呀😂,以后再有题目再说吧。。。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值