矩阵快速幂

来源:互联网 发布:算法导论中文第四版pdf 编辑:程序博客网 时间:2024/05/21 10:48

今天又翻到开学初的一个ds上的题目,求斐波那契数列的第n项;

斐波那契有几种求法

1,通项公式:下一项等于前两项的和,其中,F0=0;F1=1;Fn=Fn-1+Fn-2;

2,数列的第n项,等于n个{ 1  1 } 矩阵相乘;

 1   0

若一项一项的相乘,为O(n),

使用矩阵快速幂,则为O(logn);

比如n^7=n*n*n*n*n*n*n=(n*n)*(n*n)*(n*n)*n =n^4 * n^2 * n

#include<stdio.h>#include<stdlib.h>struct matrix{int a[2][2];}A,G;void init(){A.a[0][0]=A.a[0][1]=A.a[1][0]=1;A.a[1][1]=0;G.a[0][0]=G.a[1][1]=1;G.a[0][1]=G.a[1][0]=0;}matrix mutiply(matrix x,matrix y) //模拟矩阵乘法{int i,j,k;matrix temp;temp.a[0][0]=temp.a[0][1]=temp.a[1][0]=temp.a[1][1]=0;for(i=0;i<2;i++){for(j=0;j<2;j++){for(k=0;k<2;k++){temp.a[i][j]=temp.a[i][j]+x.a[i][k]*y.a[k][j];temp.a[i][j]=temp.a[i][j]%10000;}}}return temp;}void cals(int n)   //矩阵快速幂相乘{while(n){if(n&1){G=mutiply(G,A);//G用于消除奇数项,n--;}n>>=1;A=mutiply(A,A);//A用于快速幂}}int main(){int n,data;init();scanf("%d",&n);cals(n);printf("jieguo=%d",G.a[0][1]);system("pause");return 0;}

0 0
原创粉丝点击