本蒟蒻刚刚接触矩阵乘法,在P1306 斐波那契公约数中,我使用的乘法如下:
Info operator * (const Info &x,const Info &y){
Info now;
F(i, 1, 2){
F(j, 1, 2)now.a[i][j] = 0;
}
F(i, 1, 2){
F(j, 1, 2){
F(k, 1, 2){
now.a[i][j] += (x.a[i][k] * y.a[k][j] % MOD);
now.a[i][j] %= MOD;
}
}
}
return now;
}
看起来似乎非常的对,但在P5550 Chino的数列中,我按第一篇题解给出的方法构造了两个矩阵,相乘却得到了错误的矩阵。发现在这篇题解里,乘法是这样的:
jz operator * (const jz &a,const jz &b)//矩阵重载乘号
{
jz lin;
for(int i=1;i<=80;++i)
{
for(int j=1;j<=80;++j)
{
lin.c[i][j]=0;
for(int k=1;k<=80;++k)
{
lin.c[i][j]+=(a.c[k][j]*b.c[i][k]);//这一行不同
}
}
}
return lin;
}
按题解里的方法乘就对了,但没搞懂为什么。向各位大佬求教。