斐波那契矩阵

来源:互联网 发布:开淘宝店卖土特产 编辑:程序博客网 时间:2024/06/06 06:58
//0,1起始的斐波那契数列#include<stdio.h>const int MOD=1e9+7;struct matrix{    int x,y,**s;    void init(const int &a,const int &b){        x=a;y=b;        s=new int*[a];        for(int i=0;i<a;i++){            s[i]=new int[b];        }    }};void mat_multi(const matrix m1,const matrix m2,matrix &m3){    m3.init(m1.x,m2.y);    for(int i=0;i<m1.x;i++){        for(int j=0;j<m2.y;j++){            m3.s[i][j]=0;            for(int k=0;k<m1.y;k++){                m3.s[i][j]+=m1.s[i][k]*m2.s[k][j];            }        }    }}void mat_input(matrix &m){    int dx,dy;    scanf("%d%d",&dx,&dy);    m.init(dx,dy);    for(int i=0;i<m.x;i++){        for(int j=0;j<m.y;j++){            scanf("%d",&m.s[i][j]);        }    }}int mat_print(const matrix &m){    for(int i=0;i<m.x;i++){        for(int j=0;j<m.y;j++){            printf("%d ",m.s[i][j]);        }        putchar('\n');    }}matrix mat_pow(matrix mx,const int k){    if(k==1)return mx;    matrix mt;    mt.init(2,2);    mat_multi(mat_pow(mx,k/2),mat_pow(mx,k/2),mt);    if(k&1) mat_multi(mt,mx,mt);    return mt;}int main(){    int a,b,k;    scanf("%d%d%d",&a,&b,&k);    matrix M,m0;    M.init(1,2);    M.s[0][0]=a;    M.s[0][1]=b;    m0.init(2,2);    m0.s[0][0]=m0.s[0][1]=m0.s[1][0]=1;    m0.s[1][1]=0;    m0=mat_pow(m0,k);    mat_multi(M,m0,M);    printf("%d",M.s[0][1]);}
//测试组#include<stdio.h>const int MOD=1e9+7;struct matrix{    int x,y,**s;    void init(const int &a,const int &b){        x=a;y=b;        s=new int*[a];        for(int i=0;i<a;i++){            s[i]=new int[b];        }    }};void mat_multi(const matrix m1,const matrix m2,matrix &m3){    m3.init(m1.x,m2.y);    for(int i=0;i<m1.x;i++){        for(int j=0;j<m2.y;j++){            m3.s[i][j]=0;            for(int k=0;k<m1.y;k++){                m3.s[i][j]+=m1.s[i][k]*m2.s[k][j];            }        }    }}void mat_input(matrix &m){    int dx,dy;    scanf("%d%d",&dx,&dy);    m.init(dx,dy);    for(int i=0;i<m.x;i++){        for(int j=0;j<m.y;j++){            scanf("%d",&m.s[i][j]);        }    }}int mat_print(const matrix &m){    for(int i=0;i<m.x;i++){        for(int j=0;j<m.y;j++){            printf("%d ",m.s[i][j]);        }        putchar('\n');    }}matrix mat_pow(matrix mx,const int k){    if(k==1)return mx;    matrix mt;    mt.init(2,2);    mat_multi(mat_pow(mx,k/2),mat_pow(mx,k/2),mt);    if(k&1) mat_multi(mt,mx,mt);    return mt;}void std_fib(int a,int b,int k){    int u=a,v=b;    while((k--)>0){        printf("%d ",u);u+=v;        if((k--)>0){            printf("%d ",v);v+=u;        }    }    printf("\n");}int main(){    int a,b,k0;    scanf("%d%d%d",&a,&b,&k0);    for(int k=1;k<=k0;k++){        matrix M,m0;        M.init(1,2);        M.s[0][0]=a;        M.s[0][1]=b;        m0.init(2,2);        m0.s[0][0]=m0.s[0][1]=m0.s[1][0]=1;        m0.s[1][1]=0;        m0=mat_pow(m0,k);        mat_multi(M,m0,M);        printf("%d ",M.s[0][1]);    }    printf("\n");    std_fib(a,b,k0);}
原创粉丝点击