【洛谷】P1255 数楼梯(高精度加法+斐波那契数列)题解
原题地址:https://www.luogu.org/problem/P1255
题目背景
数楼梯
题目描述
楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入输出格式
输入格式:
一个数字,楼梯数。
输出格式:
走的方式几种。
输入输出样例
输入样例#1:
4
输出样例#1:
5
说明
时空限制: 1000ms/128MB
60% N<=50
100% N<=5000
思路:
这是一道斐波那契数列题,走楼梯,要么一次走一格,要么一次走两格,则每次的走法 = 上一格的方案数 + 上上格的方案数,但是由于数很大,所以需要用到高精度加法。用二维数组f[m][i]表示m阶台阶对应的走法数,而i表示数位。
斐波那契数列递推公式:F[i] = F[i-1] + F[i-2]
代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
int f[5050][5050],len=1; //f[m][i]表示m阶台阶对应的走法数,i表示数位
void hpa(int m) //高精度加法,m表示阶数
{
for(int i=1;i<=len;i++)
f[m][i]=f[m-1][i]+f[m-2][i]; //套用斐波那契数列递推公式
for(int i=1;i<=len;i++) //遍历每一个数位
{
if(f[m][i]>=10) //如果该数位大于等于10则进位
{
f[m][i+1]+=f[m][i]/10;
f[m][i]%=10;
if(f[m][len+1]) //如果进位后方法数不为0则位数加1
len++;
}
}
}
int main()
{
int n;
scanf("%d",&n);
f[1][1]=1; //一阶有一种
f[2][1]=2; //二阶有两种
for(int i=3;i<=n;i++)
hpa(i); //调用高精度加法的函数
for(int i=len;i>=1;i--) //倒序输出
printf("%d",f[n][i]);
return 0;
}