矩阵快速幂 模板
Posted seventh成长中---
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵快速幂 模板相关的知识,希望对你有一定的参考价值。
矩阵快速幂模板
1 #include<stdio.h> 2 #include<math.h> 3 #include<set> 4 #include<string.h> 5 using namespace std; 6 int const mod=1e9+7; 7 struct matrix 8 { 9 long long m[3][3]; 10 matrix() 11 { 12 memset(m,0,sizeof(m)); 13 } 14 matrix operator*(const matrix b)const 15 { 16 int i,j,k; 17 matrix ans; 18 for(i=0; i<3; i++) 19 { 20 for(j=0; j<3; j++) 21 { 22 ans.m[i][j]=0; 23 for(k=0; k<3; k++) 24 { 25 ans.m[i][j]+=m[i][k]*b.m[k][j]; 26 ans.m[i][j]%=mod; 27 } 28 } 29 } 30 return ans; 31 } 32 void set(int a,int b) 33 { 34 m[0][0]=a; 35 m[0][1]=b; 36 m[1][0]=1; 37 m[1][1]=0; 38 m[2][0]=1; 39 m[2][1]=0; 40 m[2][2]=1; 41 } 42 } e; 43 int qpow(int n,int f1,int f2,int a,int b) 44 { 45 n--; 46 e.m[0][0]=1; 47 e.m[1][1]=1; 48 e.m[2][2]=1; 49 matrix temp,ans; 50 ans=e; 51 temp.set(a,b); 52 while(n) 53 { 54 if(n&1) 55 ans=ans*temp; 56 temp=temp*temp; 57 n>>=1; 58 } 59 long long fn=(ans.m[1][0]*f1+ans.m[1][1]*f2)%mod; 60 long long sum=(ans.m[2][0]*f1+ans.m[2][1]*f2+ans.m[2][2]*f2)%mod; 61 printf("%I64d %I64d\n",fn,sum); 62 return fn; 63 } 64 int main() 65 { 66 int i; 67 for(i=1;i<=10;i++) 68 printf("%d\n",qpow(i,1,1,1,1)); 69 return 0; 70 }
以上是关于矩阵快速幂 模板的主要内容,如果未能解决你的问题,请参考以下文章