原题链接:http://118.190.20.162/view.page?gpid=T169
AcWing链接:https://www.acwing.com/file_system/file/content/whole/index/content/10768311/
笔记
2025.3.3
1.按照公式一步一步乘矩阵产生中间数,在遇到n=10000时会产生Segmentation Fault
2.看了题解之后,需要从右往左算,因为Q(n,d) x K(d,n)的结果是a[n][n],如果K(d,n) x V(n,d)=[d][d],数量级会小很多
第一版:(在遇到n=10000时会产生Segmentation Fault)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n=0;
int d=0;
cin>>n>>d;
long long int q[n][d];
long long int k[n][d];
long long int a[n][n];
long long int b[n][n];
long long int v[n][d];
long long int w[n];
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<n;i++)
{
for(int j=0;j<n;j++)
{
a[i][j]=0;
b[i][j]=0;
}
}
for(int i=0;i<n;i++)
{
for(int k1=0;k1<n;k1++)
{
for(int j=0;j<d;j++)
{
a[i][k1]+=q[i][j]*k[k1][j];
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
a[i][j]=a[i][j]*w[i];
}
}
for(int i=0;i<n;i++)
{
for(int k1=0;k1<d;k1++)
{
for(int j=0;j<n;j++)
{
b[i][k1]+=a[i][j]*v[j][k1];
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<d;j++)
{
cout<<b[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
第二版(Accepted)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n=0;
int d=0;
cin>>n>>d;
long long int q[n][d];
long long int k[n][d];
long long int a[d][d];
long long int b[n][d];
long long int v[n][d];
long long int w[n];
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<d;j++)
{
a[i][j]=0;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<d;j++)
{
b[i][j]=0;
}
}
for(int i=0;i<d;i++)
{
for(int k1=0;k1<d;k1++)
{
for(int j=0;j<n;j++)
{
a[i][k1]+=k[j][i]*v[j][k1];
}
}
}
for(int i=0;i<n;i++)
{
for(int k1=0;k1<d;k1++)
{
for(int j=0;j<d;j++)
{
b[i][k1]+=a[j][k1]*q[i][j];
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<d;j++)
{
b[i][j]=b[i][j]*w[i];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<d;j++)
{
cout<<b[i][j]<<" ";
}
cout<<endl;
}
return 0;
}