struct nn
{
int a[5][5];
int n,m;
} ;
矩阵相乘
由m行、n列的标量所构成的数组被称为一个m × n的矩阵。一般用大写字母表示矩阵,对应的小写字母表示矩阵中的项。这里,aij就是矩阵A中第i行第j列的项。
定义矩阵A , B 。A和B可以作乘法操作当且仅当A的大小是a × b,B的大小是b × c ,其中a , b , c 皆为正整数。设矩阵C = A B ,则C的大小是a × c ,且有
nn multi(nn A,nn B) {
nn c;
c.n=A.n,c.m=B.m; //乘法后的矩阵的行数与一个矩阵相同,列数与第二个矩阵相同
for (int i=1; i<=c.n; i++) { //初始化
for (int j=1; j<=c.m; j++)
c.a[i][j]=0;
}
for (int k=1; k<=A.m; k++) { //先枚举中间的数,时间上比较优秀,按k,i,j的顺序依次枚举
for (int i=1; i<=A.n; i++) {
for (int j=1; j<=B.m; j++) {
c.a[i][j]+=A.a[i][k]*B.a[k][j];
}
}
}
return c;
}
矩阵转置
矩阵乘法的快速幂
定义矩阵M,M的大小为N × N ,t个矩阵M相乘记为M^T
因为矩阵乘法满足结合律,所以可以用快速幂在 O((N^3)log t) 的时间内求出
过程如下:
void power(LL k) //计算A^k,并存在数组B中
{
if (k==1)
{
B=A;
return;
}
power(k/2); //计算A^(k/2)
B=B*B; //直接用乘号即可调用上述过程,对A^(k/2)平方
if (k&1)
B=B*A; //如果是奇数,在乘上一个A
}