注意点:
1.数据很大,要用long long定义,否则数据会爆
2.矩阵相乘要调换顺序
3.计算完直接输出,避免再用一个很大的数组去存,节约时间空间
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll Q[10005][25];
ll K[10005][25];
ll V[10005][25];
ll W[10005];
ll KT[25][10005]; //K转置后的矩阵
ll a[25][25]; //KT*V后的矩阵
ll b[10005][25]; //Q*a*w后的矩阵,即最终答案
int main()
{
int n,d;
cin>>n>>d;
//输入数据
for(int i=0;i<n;i++)
{
for(int j=0;j<d;j++)
{
cin>>Q[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<d;j++)
{
cin>>K[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<d;j++)
{
cin>>V[i][j];
}
}
for(int i=0;i<n;i++) cin>>W[i];
//处理转置
for(int i=0;i<d;i++)
{
for(int j=0;j<n;j++)
{
KT[i][j]=K[j][i];
}
}
//KT x V 交换矩阵相乘顺序
for(int i=0;i<d;i++)
{
for(int j=0;j<d;j++)
{
a[i][j]=0;
for(int t=0;t<n;t++)
{
a[i][j]+=(KT[i][t]*V[t][j]);
}
}
}
//a*Q*W
for(int i=0;i<n;i++)
{
for(int j=0;j<d;j++)
{
b[i][j]=0;
for(int t=0;t<d;t++)
{
b[i][j]+=(Q[i][t]*a[t][j]);
}
b[i][j]*=W[i];
cout<<b[i][j]<<' '; //直接输出,不要再用数组去存,节约时间空间
}
cout<<endl;
}
}