矩阵(mn)基本运算:
+/-:对应位上的数加减;
X:(nn)矩阵 ,c[i][j]=(c[i][j]+a[i][k]*b[k][j]);
对应代码:
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c.m[i][j]=a.m[i][j]+(-)b.m[i][j];//+/-
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
c.m[i][j]=c.m[i][j]+a.m[i][k]*b.m[k][j];//*
结构体的定义:
虽可直接定义数组来使用,但为了更加简明,清楚,定义结构体
又因使用C++编译器,无需特地使用typedef struct,所以在此直接使用struct;
struct maxtrix
{
int m[maxn][maxn]
};
int main()
{
maxtrix c;//使用
}
单位矩阵:相当于乘法中的1
int main()
{
maxtrix c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c.m[i][j]=(i==j);
return 0;
}
快速幂(数):
二进制的使用
int quickpower(int a,int k)//a^k
{
int c=1;
while(k)
{
if(k&1) c*=a;
k>>=1;
a*=a;
}
return c;
}
快速幂(矩阵):
类似,多了一步矩阵的乘法
maxtrix mul(maxtrix a,maxtrix b)
{
maxtrix c;
memset(c.m,0,sizeof(c.m));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
c[i][j]=(c[i][j]+a[i][k]*b[k][j])%mod;//通常数大,需取模
return c;
}
maxtrix quickpower(maxtrix a,int k)//a^k
{
maxtrix c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=(i==j);
while(k)
{
if(k&1) c=mul(c,a);
k>>=1;
a=mul(a,a);
}
return c;
}
例题:
1:Tr A//熟悉基本操作
Input
数据的第一行是一个T,表示有T组数据。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。