1. 程式人生 > >矩陣快速冪之斐波那契數列的前1000,000,000項mod10000

矩陣快速冪之斐波那契數列的前1000,000,000項mod10000

  前陣子看的數學部落格發現網上的那個斐波那契的矩陣快速冪的演算法並不是特別好懂,還難記,就自己用矩陣乘法的定義

寫了一個關於斐波那契數列矩陣快速冪的程式碼,方便記憶,但是略low。

 快速冪部分就是:

res=E;//E是單位矩陣

 while (n){

 if (n&1)//二進位制最後一位是1{

res=res*A;

}

A*=A;

n>>=1;//二進位制後移一位

}

最後res就是所求矩陣

矩陣乘法就是按照定義寫的,也就是所求矩陣的第i行第j列的元素等於前面矩陣第i行×後面矩陣的第j列

完整程式碼如下:

#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<string.h>
using namespace std;
long long  a[3][3],b[3][3],c[3][3],d[3][3];
void fun (long long e[][3],long long f[][3],long long g[][3]){
    long long  i,j,k,l,m,n,x,y;
    for (i=1;i<=2;i++){
        for (j=1;j<=2;j++){
            for (y=0,k=1;k<=2;k++){
                y+=e[i][k]*f[k][j]%10000;
            }
            g[i][j]=y%10000;
        }
    }
}
long long  fei(long long  n){
    long long i,j,k,l,m;
    while (n){
    if (n&1){
        fun(a,c,b);
        for (i=1;i<=2;i++)
        for (j=1;j<=2;j++)
        c[i][j]=b[i][j];
    }
    fun(a,a,b);
    for (i=1;i<=2;i++)
    for (j=1;j<=2;j++)
    a[i][j]=b[i][j];
    n>>=1;
    }
    return c[1][2];
}
int main(){
    long long i,j,k,l,m,n,x,y;
    while (cin>>n){
    for (i=1;i<=2;i++){
        for (j=1;j<=2;j++){
            a[i][j]=1;
        }
    }
    a[2][2]=0;
    c[1][1]=1;
    c[1][2]=0;
    c[2][1]=0;
    c[2][2]=1;
    cout<<fei(n)<<endl;
    }
}