矩阵快速幂笔记

快速幂求斐波那契数列

 1 //答案对100000007取模 
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 #define MOD 100000007
 7 using namespace std;
 8 typedef long long ll;
 9 struct sq{
10     ll sq[2][2];
11     void mes(){
12         memset(sq,0,sizeof(sq));
13     }
14 };
15 sq operator *(sq a,sq b){
16     sq tmp;
17     tmp.mes();
18     for(int i=0;i<2;i++){
19         for(int j=0;j<2;j++){
20             for(int k=0;k<2;k++){
21                 tmp.sq[i][j]=(tmp.sq[i][j]+a.sq[i][k]*b.sq[k][j])%MOD;
22             }
23         }
24     }
25     return tmp;
26 }
27 ll fi(int n){
28     sq ans,m;
29     ans.mes();
30     m.mes();
31     m.sq[0][0]=m.sq[0][1]=m.sq[1][0]=1;
32     m.sq[1][1]=0;
33     ans.sq[0][0]=ans.sq[1][1]=1;
34     ans.sq[0][1]=ans.sq[1][0]=0;
35     while(n){
36         if(n&1){
37             ans=ans*m;
38         }
39         m=m*m;
40         n>>=1;
41     }
42     return ans.sq[0][1]%MOD;
43 }
44 int main(){
45     int n;
46     scanf("%d",&n);
47     printf("%lld",fi(n));
48     return 0;
49 }

 

posted @ 2018-04-26 15:12  DCDCBigBig  阅读(117)  评论(0编辑  收藏  举报