晴天的魔法乐园——上楼(组合数)

2023-11-11 13:31

本文主要是介绍晴天的魔法乐园——上楼(组合数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:https://judger.net/problem/1054

Problem Description

我打算走楼梯上楼,共有n级台阶。
我身轻如燕,所以每次都可以选择上一级台阶或者两级台阶。
问有多少种上楼的方式。
例如当n=3时,共有三种方式上楼:

  • 一级 -> 一级 -> 一级;
  • 一级 -> 二级;
  • 二级 -> 一级。

Input

每个输入文件一组数据。
一个正整数n(n<=45),表示台阶级数。

Output

一个正整数,表示上楼的方案数。

Sample Input 1

1

Sample Output 1

1

Sample Input 2

2

Sample Output 2

2

Sample Input 3

3

Sample Output 3

3

1、分析

这种题目看都不用看,想都不用想,绝对是找规律的题。

(1)、找规律。

考虑一下情形:

n = 1时:1种,①:1

n = 2时:2种,①:1 + 1

                        ②:2

n = 3时:3种,①:1 + 1 + 1

                        ②:1 + 2

                        ③:2 + 1

n = 4时:5种,①:1 + 1 + 1 + 1

                        ②:1 + 1 + 2

                        ③:1 + 2 + 1

                        ④:2 + 1 + 1

                        ⑤:2 + 2

n = 5时:8种,①:1 + 1 + 1 + 1 + 1

                        ②:1 + 1 + 1 + 2

                        ③:1 + 1 + 2 + 1

                        ④:1 + 2 + 1 + 1

                        ⑤:2 + 1 + 1 + 1

                        ⑥:1 + 2 + 2

                        ⑦:2 + 2 + 1

                        ⑧:2 + 1 + 2

...

n=5时,总数=5个楼梯中选择0个2级楼梯的种类数 + 4个楼梯中选择1个2级楼梯的种类数 + 3个楼梯中选择2个两级楼梯的种类数。 

听起来有点像组合数?没错,就是组合数。

即:

注意n为奇数和偶数都是计算到n/2向下取整处哦。

知道了以上规律之后,就是计算组合数的问题了。

(2)求组合数。

由于int所能表示的最大正整数2 ^ 31 - 1 = 2147483647‬ ≈ 2 * 10 ^ 9 < 13!;

long long所能表示的正整数:2 ^ 64 - 1 = 9223372036854775807‬ ≈ 9 * 10 ^ 18 < 21!;

因此不能表示最大45!的整数。因此采用下面最右边的公式进行计算。

image.png

有同学可能会考虑到整数相除会不精确,这里做除法的时候,需要增加一个判断,即(m - n + i) % i ==0的时候再相除。

2、代码

#include<stdio.h>//计算组合数m为下标,n为上标 
int fac(int m, int n){if(n == 0){return 1;}else if(n == 1){return m;}else{int plus = 1;		//每一步计算临时保存的结果 for(int i = 1; i <= n; i++){plus = plus * (m - n + i);if(plus % i == 0){	//当可以进行整除的时候再进行除法操作 plus /= i;}}return plus;}
}int main(){int n;scanf("%d", &n);int i = n, j = 0, sum = 0;while(i - j >= 0){	//当上标小于等于下标时才进行计算 sum += fac(i, j);i--;j++;}printf("%d\n", sum);return 0;
}

原文链接:https://www.qsp.net.cn/art/173.html

这篇关于晴天的魔法乐园——上楼(组合数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/390398

相关文章

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

Go组合

摘要 golang并非完全面向对象的程序语言,为了实现面向对象的继承这一神奇的功能,golang允许struct间使用匿名引入的方式实现对象属性方法的组合 组合使用注意项 使用匿名引入的方式来组合其他struct 默认优先调用外层方法 可以指定匿名struct以调用内层方法 代码 package mainimport ("fmt")type People struct{}type Pe

组合c(m,n)的计算方法

问题:求解组合数C(n,m),即从n个相同物品中取出m个的方案数,由于结果可能非常大,对结果模10007即可。       共四种方案。ps:注意使用限制。 方案1: 暴力求解,C(n,m)=n*(n-1)*...*(n-m+1)/m!,n<=15 ; int Combination(int n, int m) { const int M = 10007; int

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题,就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的,就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream># include<vector>using namespace std;int main(){int n,m;cin>>n>>m;std::vector<i

INDEX+SMALL+IF+ROW函数组合使用解…

很多人在Excel中用函数公式做查询的时候,都必然会遇到的一个大问题,那就是一对多的查找/查询公式应该怎么写?大多数人都是从VLOOKUP、INDEX+MATCH中入门的,纵然你把全部的多条件查找方法都学会了而且运用娴熟,如VLOOKUP和&、SUMPRODUCT、LOOKUP(1,0/....,但仍然只能对这种一对多的查询望洋兴叹。   这里讲的INDEX+SMALL+IF+ROW的函数组合,

代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

完全背包问题                  和01背包最大区别就是一个物品可以重复放多次,因此遍历空间时可以从前往后。 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt

探索Python的数学魔法:Numpy库的神秘力量

文章目录 探索Python的数学魔法:Numpy库的神秘力量背景:为什么选择Numpy?Numpy是什么?如何安装Numpy?五个简单的库函数使用方法场景应用常见Bug及解决方案总结 探索Python的数学魔法:Numpy库的神秘力量 背景:为什么选择Numpy? 在Python的世界中,数据处理和科学计算是不可或缺的一部分。但原生Python在处理大规模数据时可能会显

【内网】ICMP出网ew+pingtunnel组合建立socks5隧道

❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 通过环境搭建,满足以下条件: 攻击机模拟公网vps地址,WEB边界服务器(Windows Server 2008)模拟公司对外提供Web服务的机器,该机器可以通内网,同时向公网提供服务。内网同网段存在一台Windows内网服务

玩转Python Turtle库,实现满屏飘字的魔法!

前言     本文将教你如何使用Python的Turtle库,通过简单的编程实现满屏飘字的炫酷效果。无需复杂的编程知识,跟着我们的步骤,你也可以成为编程小达人! 效果展示 开发过程 一、准备工作 首先,确保你的电脑上已经安装了Python环境。然后,你需要安装或更新Turtle库(通常Python安装时自带了Turtle库)。 二、编写代码 接下来,我们将通过编写一个简单的P

PyPortfolioOpt:Python中的投资组合优化工具

PyPortfolioOpt:Python中的投资组合优化工具 在金融领域,投资组合优化是一个关键的环节,它帮助投资者在追求最大回报的同时管理风险。今天,我们将探索一个名为PyPortfolioOpt的Python库,它提供了一系列的工具和算法,用于构建和优化投资组合。 概览 PyPortfolioOpt是一个开源的Python库,专门用于金融投资组合的优化。它包括经典的有效前沿、Black