大扎好,我系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 }
嗯,没了(暂时)
又是一个正经的水笔呢(