数楼梯——恶心的高精斐波那契数列

题目描述

楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。

编一个程序,计算共有多少种不同的走法。

输入输出格式

输入格式:

一个数字,楼梯数。

输出格式:

走的方式几种。

输入输出样例

输入样例#1:

4

输出样例#1:

5

说明

用递归会太慢,需用递推

(60% N<=50 ,100% N<=5000)

啊啊,数据太大了!

肿么办?!

当数据等于5000时的斐波那契数为

62763028004889570860352531083496840554785287027364574390258244489279372568116632
64475883711527806250329984690249846819800648580083040107584710332687596562185073
64042228679923993261579710597471085709548734282035130747714187501217687430715601
62299658325891377797249738543627776298782295055002604771361083637090900104215369
15488632339240756987974122598603591920306874926755600361865354330444681915154695
74185196007108994401531930012857410766275705479064815275136647552912187721278548
96651017337558985803179844029638737381870001207378241931620113992005474240344408
36239726275765901190914513013217132050988064832024783370583789324109052449717186
85732723978300002079177780450393043987506866268767067880291426978481702256708806
94962311114079089533139023985296550560822285987158823657794699024656757156991872
25655878240668599547496218159297881601061923195562143932693324644219266564617042
93422789337117983238964289528540126387534264046801737892592148358011127805504425
41983822655673959464318033043043268650777429258187573706917261682286488413192314
70626

long long 也开不开啊!

那真么办?!

用高精啊!!!

代码

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
int f[5001][5001]={0},len[5001]={0};
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘)
    {
        if(ch==‘-‘)
          f=-1;
        ch=getchar();
    }
    while(ch>=‘0‘&&ch<=‘9‘)
    {
        x=x*10+ch-‘0‘;
        ch=getchar();
    }
    return x*f;
}
void fei(int a,int b,int c)
{
    for(int i=1;i<=max(len[b],len[c]);i++)
    {
        f[a][i]+=f[b][i]+f[c][i];
        if(f[a][i]>9)
        {
            f[a][i+1]+=f[a][i]/10;
            f[a][i]%=10;
            len[a]=max(len[a],i+1);
        }
        else len[a]=max(len[a],i);
    }
}
int main()
{
    int n=read();
    f[1][1]=1;
    f[2][1]=2;
    len[0]=1;
    len[1]=1;
    for(int i=3;i<=n;i++)
    {
        fei(i,i-1,i-2);
    }
    for(int i=len[n];i>=1;i--)
      cout<<f[n][i];
    return 0;
}
时间: 2024-12-29 10:07:27

数楼梯——恶心的高精斐波那契数列的相关文章

蜜蜂路线——有毒的高精 斐波那契

题目背景 无 题目描述 一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房M开始爬到蜂房N,M<N,有多少种爬行路线? 输入输出格式 输入格式: 输入M,N的值 输出格式: 爬行有多少种路线 输入输出样例 输入样例#1: 1 14 输出样例#1: 377 说明 无 无说明!!! 普通的斐波那契?? 哦,wa了! 无说明,你知道他到底有几个啊! 那就是用高精啊! 代码 #include<cmath> #include<cstdio&

对斐波那契数列的理解

在数学上,费波那契数列是以递归的方法来定义: (n≧2) 费波那契数列由0和1开始,之后的费波那契系数就是由之前的两数相加而得出. 与斐波那契数列有关的问题,都符合这样的描述: 当前状态的得出是依赖于前两项的状态,给出初始状态F(0),F(1),之后的每一项都满足共同的特点,即为前两项状态相加. 前两项的状态,分别为当前状态的两种解法,适用加法原理. 下面给出几个例题: 1.Climbing Stairs 爬楼梯问题 每次只能爬1或2步,那么爬到第n层的方法要么是从第n-1层一步上来的,要不就是

计蒜客之斐波那契数列

斐波那契数列是一种非常有意思的数列,由 0 和 1 开始,之后的斐波那契系数就由之前的两数相加.用数学公式定义斐波那契数列则可以看成如下形式: F0=0 F1=1 Fn=Fn-1+Fn-2 我们约定 Fn 表示斐波那契数列的第 n 项,你能知道斐波那契数列中的任何一项吗? 输入包括一行,包括一个数字N(0≤N≤50). 输出包括一行,包括一个数字,为斐波那契数列的第N项的值. 样例输入 7 样例输出 13 C++实现代码如下: #include <iostream> using namespa

斐波拉契数列、楼梯问题、奶牛问题

斐波拉契数列:波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)[from 百度百科 http://baike.baidu.com/link?url=8LKtKTAllUGDMe610zIO0DAjS3CCeAOpXiCFvH_Y47_I_XDRgzyGcrzsodd1OHO726FJNPWkqzkQC7PIuGu_

上楼梯问题,斐波那契数列

问题描述: 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或者二级,要走上m级,共有多少走法?注:规定从一级到一级有0种走法.给定一个正整数int n,请返回一个数,代表上楼的方式数.保证n小于等于100.为了防止溢出,请返回结果Mod 1000000007的值. 算法思路:这道题其实就是斐波那契数列的应用,因为可以走一步,又可以走两步,开始在第一层台阶.所以,上第二层台阶,有1种方法,上第三层台阶,有2种方法,上后一层,可以通过前一层再走1步,前两层再走2步.所以,就是f(x)= f(

用for循环和递归调用写出1~N的斐波那契数列的和 和第N位的数

首先注意: 代码是从上往下,从左往右执行的!! 这是for循环写的 m=任意数.代表1~多少位的和 public class Fei_Bo_Na_Qi{    public static void main(String[] args){        int m = 30;  //这里代表1~30位的和        System.out.println( "斐波那契数列的第 "+m+" 位数为: "+m1(m) );//  在输出的时候调用函数    }   

超级楼梯-斐波那契数列的运用

Problem Description 有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法? Input 输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数. Output 对于每个测试实例,请输出不同走法的数量 Sample Input 2 2 3 Sample Output 1 2 每次有2种走法,并且要求最后还能干好到达M级.正着不行,逆向思维一下,要达到最后一级的前一级只能是M-

javaScript实现回文数、水仙花数判断和输出斐波那契数列

    // 判断一个数是不是回文数                    // 方法一:先将数字转换成字符串,然后依次判断第一个和最后一个数字,第二个和倒数第二个数字...是否相等     function PalindromeNumber1(num){         var str = num.toString();         var flag = true;         var len = str.length;         for(var i = 0; i < (len 

给定斐波那契数列的项数求对应的数值的普通方法和优化处理

1 /** 2 给定斐波那契数列的项数求对应的数值 3 参考:剑指Offer 4 */ 5 #include <stdio.h> 6 7 int fib(int n); 8 long long fibonacci(unsigned int n); 9 int main(int argc, const char * argv[]) { 10 11 int n; 12 13 while (1) { 14 15 printf("请输入你想知道到的斐波那契数列的项数:\t"); 1