斐波那契数列的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\n",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 }

嗯,没了(暂时)

又是一个正经的水笔呢(

posted on 2018-02-22 21:31  bb机  阅读(239)  评论(0编辑  收藏  举报

导航