矩阵快速幂

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define Mod 100000007
typedef long long ll;
#define N 2//这里表示2*2的矩阵//如果是3*3的  则可以令为N 3 
struct Mu{
  ll    a[N][N];
  Mu(){
         memset(a,0,sizeof(a));
  }
};
Mu Multiply(Mu t1,Mu t2){//求两个矩阵相乘 
      Mu res;
      for(ll i=0;i<N;i++){
            for(ll j=0;j<N;j++){
                   for(ll k=0;k<N;k++)
                   {
                             res.a[i][j]=(res.a[i][j]+t1.a[i][k]*t2.a[k][j])%Mod;
                   }
            }
      }
      return res;
} 
Mu QP(Mu x,ll n)//矩阵快速幂 返回结果对象 
{
       Mu res;
       res.a[0][0]=res.a[1][1]=res.a[2][2]=1;//单位矩阵
       while(n){
             if(n&1){
                    res=Multiply(res,x);
             }
             x=Multiply(x,x);
             n>>=1;
       } 
       return res;
}
Mu ans;
ll n,F1=1,F2=1;
void init(){
    //初始化矩阵
  //比如斐波那契数列 
    ans.a[0][0]=ans.a[0][1]=ans.a[1][0]=1;
}
void Ans(){
     ans=QP(ans,n-2);//算ans^n
    cout<<(ans.a[0][0]*F1+ans.a[0][1]*F2)%Mod<<endl;
}
int main(){
    cin>>n;
    if(n==1) return cout<<F1<<endl,0;
    else if(n==2) return  cout<<F2<<endl,0;
    init();
    Ans();
    return 0;
}

 

posted @ 2020-07-01 21:10  _LH2000  阅读(140)  评论(0编辑  收藏  举报