斐波那契的矩阵快速幂

来源:互联网 发布:canbot 软件 编辑:程序博客网 时间:2024/06/05 18:47

斐波那契数列为例 an=an-1+an-2

我们的目的是通过矩阵乘法,求得斐波那契数列的第n项,为了得到这个结果,我们还需要由[an-2 an-1]推得[an-1 an]

我们设[an-2an-1]为矩阵A,因为A1×2B2×2=C1×2,所以C与A是同规模的矩阵

代码(来自CHC大神)

#include <cstdio>using namespace std;#define N 2#define MOD 10000//斐波那契的矩阵快速幂// a = a * bvoid matric_mul(int a[][N],int b[][N]){int i,j,k;    int tmp[N][N]={0};for(i=0;i<N;i++){for(j=0;j<N;j++){for(k=0;k<N;k++){tmp[i][j] = (tmp[i][j]+a[i][k]*b[k][j]);}}}for(i=0;i<N;i++){for(j=0;j<N;j++){a[i][j] = tmp[i][j];}}}int quickpow(int n){    //int ans=1,tmp=base;    int ans[2][2]={{1,0},{0,1}};    int tmp[2][2]={{0,1},{1,1}};    while(n){        if(n&1)matric_mul(ans,tmp);        matric_mul(tmp,tmp);        n>>=1;    }    for(int i=0;i<N;i++){for(int j = 0;j<N;j++)printf("%d\t",ans[i][j]);printf("\n");    }    return ans[0][1];}int main(){    int n;    while(~scanf("%d",&n)&&n!=-1)        printf(" f[%d] = %d\n",n,quickpow(n));    return 0;}



0 0
原创粉丝点击