fibnacci数列模板

来源:互联网 发布:js 浮点数计算误差 编辑:程序博客网 时间:2024/06/09 16:22
#include <iostream>#include <cstring>using namespace std;const int MAX=10;#define __int64 long long#define Bit(n) 1<<n#define CLR(arr,val) memset(arr,val,sizeof(arr))class Matrix{public:    Matrix(int r,int c):row(r),col(c){}    void Init()      {       CLR(map,0);        map[0][0]=map[0][1]=map[1][0]=1;    }    void Unit() //初始化为单位矩阵     {       CLR(map,0);        for(int i=0;i<row;i++)            map[i][i]=1;    }    int Result() const    {    return map[0][1]%10000;    }    friend Matrix operator*(const Matrix& ,const Matrix&);    int Pow(int);private:    __int64 map[MAX][MAX];        int row,col;       };Matrix operator*(const Matrix& M1,const Matrix& M2) //矩阵相乘模板{   Matrix M(M1.row,M2.col); //相乘之后矩阵的行和列会变化       for(int i=0;i<M1.row;i++)        for(int j=0;j<M2.col;j++)        {   M.map[i][j]=0;            for(int k=0;k<M1.col;k++)                M.map[i][j]+=M1.map[i][k]*M2.map[k][j];             M.map[i][j]%=10000;        }      return M;    }Matrix M(2,2);int Matrix::Pow(int n) //矩阵快速幂 {   Matrix temp(2,2);     temp.Init();     for(int i=0;Bit(i)<=n;i++) //利用二进制的思想求解     {       if(Bit(i)&n)     M=M*temp;         temp=temp*temp;         }    return M.Result();    }int main(){   __int64 num;    while(cin>>num,num!=-1)    {       M.Unit();        cout<<M.Pow(num)<<endl;    }    return 0;}

0 0
原创粉丝点击