几个模板: 1.单个矩阵N次方 #define N 10 #define FF(i,n) for(i=0;i<n;i++) int ans[N][N]; int init[N][N]; int buf[N][N]; void matrixMul(int a[][N],int b[][N],int n,int mod){ int i,j,k; FF(i,n)FF(j,n) buf[i][j]=0; FF(i,n)FF(k,n) if(a[i][k])FF(j,n) if(b[k][j]) buf[i][j]=(buf[i][j]+a[i][k]*b[k][j])%mod; FF(i,n)FF(j,n) a[i][j]=buf[i][j]; } void matrixMul(int n,int m,int mod){ int i,j; FF(i,n)FF(j,n) ans[i][j]=(i==j); for(;m;m>>=1){ if(m&1) matrixMul(ans,init,n,mod); matrixMul(init,init,n,mod); } } 2.优化的 #include<iostream> using namespace std; #define N 10 #define FF(i,n) for(int i=0;i<n;i++) int ans[N]; int init[N][N]; void matrixMul(int a[][N],int b[][N],int n,int mod){ int i,j,k; int buf[N][N]={0}; FF(i,n)FF(k,n) if(a[i][k])FF(j,n)if(b[k][j]) buf[i][j]=(buf[i][j]+a[i][k]*b[k][j])%mod; FF(i,n)FF(j,n) a[i][j]=buf[i][j]; } void matrixMul(int a[],int b[][N],int n,int mod){ int i,j; int buf[N]={0}; FF(i,n)FF(j,n) buf[i]=(buf[i]+a[j]*b[i][j])%mod; FF(i,n) a[i]=buf[i]; } void matrixMul(int ans[],int init[][N],int n,int m,int mod){ for(;m;m>>=1){ if(m&1) matrixMul(ans,init,n,mod); matrixMul(init,init,n,mod); } } 3.A+A^2+A^3+A^4+......+A^N 递归 #define N 31 #define FF(i,n) for(int i=0;i<n;i++) #define mod 2008 int len; struct Matrix_Cal{ int mat[N][N]; }e,init,tp1,tp2; Matrix_Cal operator+(Matrix_Cal a ,Matrix_Cal b){ Matrix_Cal c; FF(i,len)FF(j,len) c.mat[i][j]=a.mat[i][j]+b.mat[i][j]; return c; } Matrix_Cal operator*(Matrix_Cal a , Matrix_Cal b){ Matrix_Cal c; int i,j,k; FF(i,len)FF(j,len) c.mat[i][j] = 0; FF(i,len)FF(k,len) if(a.mat[i][k])FF(j,len) if(b.mat[k][j]) c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%mod; return c; } Matrix_Cal operator^(Matrix_Cal a , int b){ Matrix_Cal c=e, q=a; for(;b;b>>=1){ if(b&1) c=c*q; q=q*q; } return c; } Matrix_Cal Matrix_Sum(Matrix_Cal a,int b){ if(b==1) return a; if(b&1) return Matrix_Sum(a,b-1)+(a^b); else return ((a^(b>>1))+e)*Matrix_Sum(a,b>>1); } 4.A+A^2+A^3+A^4+......+A^N 非递归 #define N 35 #define FF(i,n) for(int i=0;i<n;i++) #define mod 1234567891 int len; struct Matrix_Cal{ __int64 mat[N][N]; }e,init,tp1; Matrix_Cal operator+(Matrix_Cal a ,Matrix_Cal b){ Matrix_Cal c; int i,j; FF(i,len)FF(j,len) c.mat[i][j]=a.mat[i][j]+b.mat[i][j]; return c; } Matrix_Cal operator*(Matrix_Cal a ,Matrix_Cal b){ Matrix_Cal c; int i,j,k; FF(i,len)FF(j,len) c.mat[i][j]=0; FF(i,len)FF(k,len) if(a.mat[i][k])FF(j,len) if(b.mat[k][j]) c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%mod; return c; } Matrix_Cal operator^(Matrix_Cal a,int b){ Matrix_Cal c=e,q=a; for(;b;b>>=1){ if(b&1) c=c*q; q=q*q; } return c; } Matrix_Cal Matrix_Sum(Matrix_Cal a ,int b){ int n = 0 ,s[N]; int i; Matrix_Cal tp1,tp2; while(b > 0){ s[n++]=b&1; b>>=1; } tp1=tp2=a; for(i=n-2;i>=0;i--){ tp1=tp1*(tp2+e); tp2=tp2*tp2; if(s[i]){ tp2=tp2*a; tp1=tp1+tp2; } } return tp1; }