首页 > 代码库 > 矩阵快速幂 模板
矩阵快速幂 模板
矩阵快速幂模板
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 }
矩阵快速幂 模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。