• 斐波那契数列的n种食用方法


    大扎好,我系bb机,贪玩斐波那契,介四里没有挽过的船新版本,挤需体验三番钟,里造会干我一样,爱象节款数列。(

    菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
    给出一个正整数k,要求菲波那契数列中第k个数是多少。

    大概就是:

    1,1,2,3,5,8,13,21,34,55,……

    (等等我是不是算错了)

    (算了不管了)

    辣么这个题呢最简单的是用递推,代码如下:

     1 #include<cstdio>
     2 using namespace std;
     3 int fblq[100];
     4 int main()
     5 {
     6     fblq[1] = fblq[2] = 1;
     7     int n,i;
     8     scanf("%d",&n);
     9     for(i = 3;i <= n;i++){
    10         fblq[i] = fblq[i - 1] + fblq[i - 2];
    11     }
    12     printf("%d",fblq[n]);
    13     return 0;
    14  } 

    诶、多简单啊

    其实到此为止就可以了,但是秉着洛谷“A+B问题”题解的精神,我又到老师的ppt里挖出了这个:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 typedef long long ll;
     6 //中间运算可能会超过int范围,需要long long
     7 const int N=2;
     8 int n,p;
     9 ll m;
    10 struct node{
    11     //结构体存储矩阵
    12     ll g[N+2][N+2];
    13 }f,res;
    14 void matrixI(node &x){
    15     //构造单位矩阵
    16     for(int i=1; i<=N; i++){
    17         for(int j=1; j<=N; j++)
    18             if(i==j) x.g[i][j]=1LL;
    19             else x.g[i][j]=0LL;
    20     }
    21 }
    22 void matrixMultiple(node &x,node &y,node &z){
    23     //矩阵乘法
    24     memset(z.g,0,sizeof(z.g));
    25     for(int i=1; i<=N; i++){
    26         for(int j=1; j<=N; j++) if(x.g[i][j]){
    27             for(int k=1; k<=N; k++){
    28                 z.g[i][k]+=x.g[i][j]*y.g[j][k];
    29                 if(z.g[i][k]>=m) z.g[i][k]%=m;
    30             }
    31         }
    32     }
    33 }
    34 void matrixMuli(int k){
    35     //快速幂运算
    36     matrixI(res);
    37     node tmp=f, t;
    38     while(k){
    39         if(k&1){
    40             matrixMultiple(res,tmp,t); res=t;
    41         }
    42         matrixMultiple(tmp,tmp,t); tmp=t;
    43         k>>=1;
    44     }
    45 }
    46 ll solve(){
    47     if(n<=2) return 1LL;
    48     matrixMuli(n-2);
    49     ll ret=res.g[1][1]+res.g[2][1];
    50     if(ret>=m) ret-=m;
    51     return ret;
    52 }
    53 int main(){
    54     scanf("%d%d",&n,&p);
    55     m=p;
    56     f.g[1][1]=1;
    57     f.g[1][2]=1;
    58     f.g[2][1]=1;
    59     f.g[2][2]=0;
    60     int res=(int)solve();
    61     printf("%d
    ",res);
    62     return 0;
    63 }

    当然递推都可以变成递归(?)的,所以就有了这个:

     1 #include<cstdio>
     2 using namespace std;
     3 int fblq(int n)
     4 {
     5     if(n == 1)    return 1;
     6     if(n == 2)    return 1;
     7     return (fblq(n - 1) + fblq(n - 2));
     8 }
     9 int main()
    10 {
    11     int n,ans;
    12     scanf("%d",&n);
    13     ans = fblq(n);
    14     printf("%d",ans);
    15     return 0;
    16 }

    嗯,没了(暂时)

    又是一个正经的水笔呢(

  • 相关阅读:
    Ext架构分析(6)最简单的layout:AnchorLayout
    Ext架构分析(4)Container之旅
    ext学习资源汇总
    DomQuery v1.1 高级
    Ext 2.0 教程 目录
    HDOJ2006 ( 求奇数的乘积 ) 【水题】
    HDOJ2017 ( 字符串统计 ) 【水题】
    状态模式(State)
    HDOJ2002 ( 计算球体积 ) 【水题】
    HDOJ2007 ( 平方和与立方和 ) 【水题】
  • 原文地址:https://www.cnblogs.com/aristocrat/p/8460182.html
Copyright © 2020-2023  润新知