啊我还是太弱了居然还要收录模板 

1.矩阵快速幂

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 struct matrix
 8 {
 9     long long m[3][3];
10 }ans ,base;
11 long long n;
12 const long long mod=1000000007;
13 matrix muti(matrix a,matrix b)//矩阵乘法满足分配率(A+B)*C=A*C+B*C,满足结合律 (A*B)*C=A*(B*C),但不满足交换律 A*B!=B*A
14 {
15     matrix tmp;
16     for(int i=1;i<=2;i++)
17      for(int j=1;j<=2;j++)
18      {
19          tmp.m[i][j]=0;
20          for(int k=1;k<=2;k++)
21           tmp.m[i][j]=(tmp.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
22      }
23      return tmp;
24 }
25 void qpow(long long x)
26 {
27     while(x)
28     {
29         if(x&1) ans=muti(ans,base);
30         base=muti(base,base);
31         x>>=1;
32     }
33 }
34 int main()
35 {
36     scanf("%lld",&n);
37     if(n<=2)
38     {
39         printf("%d",1);
40         return 0;
41     }
42     base.m[1][1]=1;base.m[1][2]=1;
43     base.m[2][1]=1;base.m[2][2]=0;
44     ans.m[1][1]=1;ans.m[1][2]=1;
45     qpow(n-2);
46     printf("%lld",ans.m[1][1]%mod);
47     return 0;
48  } 
矩阵快速幂

相关文章: