矩阵乘法

矩阵乘法

//矩阵乘法,斐波那契数列
# include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const LL mod=1e9+7;
inline void mul(LL f[2],LL a[2][2])
{
   LL c[2];
   memset(c,0,sizeof(c));
   for(int i=0;i<2;i++){
       for(int j=0;j<2;j++){
           c[i]=(c[i]+f[j]*a[j][i])%mod;
      }
  }
   memcpy(f,c,sizeof(c));
   return ;
}
inline void mulself(LL a[2][2])
{
   LL c[2][2];
   memset(c,0,sizeof(c));
   for(int i=0;i<2;i++){
       for(int j=0;j<2;j++){
           for(int k=0;k<2;k++){
               c[i][j]=(c[i][j]+a[i][k]*a[k][j])%mod;
          }
      }
  }
   memcpy(a,c,sizeof(c));
   return ;
}
int main()
{
   LL n;
   scanf("%lld",&n);
   LL f[2]={0,1};//f[0]=0,f[1]=1;
   LL a[2][2]={{0,1},{1,1}};
   for(;n;n>>=1){
       if(n&1) mul(f,a);
       mulself(a);
  }
   printf("%lld\n",f[0]);

   return 0;
}



posted @ 2022-02-26 23:15  fengzlj  阅读(52)  评论(0)    收藏  举报