当矩阵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];
}