当矩阵A是n*m,矩阵B是m*p,可以运算

矩阵乘法_快速幂

代码

for(int i=0;i<n;i++)
for(int j=0;j<p;k++)
for(int k=0;k<m;j++)
c[i][j]+=a[i][k]*b[k][j];


例题 就斐波那契数列第n项模10000的结果(n<=2*10^9)

构造矩阵式

现在,我们有A=(f[x−1],f[x−2]) B=(f[x],f[x−1])
我们就构造一个矩阵T使得

A×T=B

如何构造?

  • f[x−1]对f[x]的贡献为f[x−1]∗1,所以T1,1=1
  • f[x−2]对f[x]的贡献为f[x−2]∗1,所以T1,2=1
  • f[x−1]对f[x−1]的贡献为f[x−1]∗1,所以T2,1=1
  • f[x−2]对f[x−1]的贡献为f[x−2]∗0,所以T2,2=0

这个矩阵S就是—

[1][1]

[1][0]

(f[n],f[n-1])=(f[1],f[0])*S^n-1

S^n-1??? 快速幂啊

矩阵的快速幂怎么写呢

void pow(int k) {
while (k) {
if (k&1) mul(a,b,b);
k>>=1;
mul(a,a,a);
}
}

 自定义的mul呢

void mul(int a[2][2],int b[2][2],int ans[2][2]) {
int t[2][2];
for (int i=0;i<2;i++)
for (int j=0;j<2;j++) {
t[i][j]=0;
for (int k=0;k<2;k++) t[i][j]=(t[i][j]+a[i][k]*b[k][j])%10000;
}
for (int i=0;i<2;i++)
for (int j=0;j<2;j++) ans[i][j]=t[i][j];
}