解题思路
暴力模拟
矩阵从右往左算
注意爆int
AC代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long int LL;
const int N=1e4+10,D=30;
LL K[N][D],K_T[D][N],Q[N][D],V[N][D],W[N],RES[N][D],KV[D][D];
LL n,d;
void Multiply_QKV(LL Q[][D],int q_n,int q_d,LL KV[][D],int kv_n,int kv_d)
{
for(int i=1;i<=q_n;i++)
for(int j=1;j<=kv_d;j++)
{
LL res=0;
for(int k=1;k<=q_d;k++)
{
res+=Q[i][k]*KV[k][j];
}
RES[i][j]=res;
}
}
void Multiply_KV(LL K_T[][N],int k_n,int k_d,LL V[][D],int v_n,int v_d)
{
for(int i=1;i<=k_n;i++)
for(int j=1;j<=v_d;j++)
{
int res=0;
for(int k=1;k<=k_d;k++)
{
res+=K_T[i][k]*V[k][j];
}
KV[i][j]=res;
}
}
void T(LL S[][D],int n_k,int d_k)
{
for(int i=1;i<=n_k;i++)
for(int j=1;j<=d_k;j++)
{
K_T[j][i]=S[i][j];
}
}
int main()
{
cin>>n>>d;
for(int i=1;i<=n;i++)
for(int j=1;j<=d;j++)
cin>>Q[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=d;j++)
cin>>K[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=d;j++)
cin>>V[i][j];
for(int i=1;i<=n;i++)
cin>>W[i];
T(K,n,d);
Multiply_KV(K_T,d,n,V,n,d);
Multiply_QKV(Q,n,d,KV,d,d);
for(int i=1;i<=n;i++)
{
for(int k=1;k<=d;k++)
{
RES[i][k]=W[i]* RES[i][k];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=d;j++)
{
cout<<RES[i][j]<<" ";
}
cout<<endl;
}
return 0;
}