啊我还是太弱了居然还要收录模板
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 }