算法竞赛模板 矩阵快速幂
设A为 的矩阵,B为 的矩阵,那么称 的矩阵C为矩阵A与B的乘积,记作 ,其中矩阵C中的第 行第 列元素可以表示为:
如下所示:
当矩阵A的列数等于矩阵B的行数时,A与B可以相乘
(1) 矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
(2) 乘积C的第 行第 列的元素等于矩阵A的第 行的元素与矩阵B的第 列对应元素乘积之和。
矩阵快速幂的模板:
就是要找到一个矩阵A,满足 F[i-1]*A=F[i]。
然后就通过矩阵的性质,计算出 F[n]=A^(n-1)*F[1]。
#define mod 10000 #define N 2 struct mat { int m[N+1][N+1]; mat() { m[1][1]=1;m[1][2]=1; m[2][1]=1;m[2][2]=0; } }; mat mul(mat a,mat b) { mat ans; int i,j,k; for(i=1;i<=N;i++) for(j=1;j<=N;j++) ans.m[i][j]=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) for(k=1;k<=N;k++) ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j])%mod; return ans; } int matqp(int p) { mat ans,t; int i,j; for(i=1;i<=N;i++) for(j=1;j<=N;j++) if(i==j)ans.m[i][j]=1; else ans.m[i][j]=0; while(p) { if(p&1) ans=mul(ans,t); t=mul(t,t); p=p>>1; } return ans.m[2][1];//视公式而定 }