AcWing 5082. 矩阵运算
原题链接
简单
作者:
Entropy_X
,
2023-11-14 13:06:28
,
所有人可见
,
阅读 81
矩阵运算
- 注意转换思路,从右向左算
- 注意使用long long
- 灵活使用vector
C++ 代码
#include<iostream>
#include<vector>
using namespace std;
const int N = 10010;
const int D = 30;
typedef long long ll;
typedef vector<vector<ll> > mat;
mat Q, K, V, tmp1, tmp2;
vector<ll> W;
mat mat_mul(mat l, mat r){
mat res;
for(int i = 0; i < l.size(); i ++){
vector<ll> tt;
for(int j = 0; j < r[0].size(); j ++){
ll t = 0;
for(int k = 0; k < r.size(); k ++){
t += l[i][k] * r[k][j];
}
tt.push_back(t);
}
res.push_back(tt);
}
return res;
}
mat trans(mat m){
mat new_m;
int w = m[0].size(), h = m.size();
for(int j = 0; j < w; j ++){
vector<ll> t;
for(int i = 0; i < h; i ++){
t.push_back(m[i][j]);
}
new_m.push_back(t);
}
return new_m;
}
void print_mat(mat m, vector<ll> W){
for(int i = 0; i < m.size(); i ++){
for(int j = 0; j < m[i].size(); j ++){
cout << m[i][j]*W[i] << " ";
}
cout << endl;
}
}
int main(){
int n, d;
cin >> n >> d;
for(int k = 0; k < 3; k ++){
for(int i = 0; i < n; i ++){
vector<ll> t;
for(int j = 0; j < d; j ++){
ll a;
cin >> a;
t.push_back(a);
}
if(k == 0){
Q.push_back(t);
}else if(k == 1){
K.push_back(t);
}else{
V.push_back(t);
}
}
}
for (int i = 0; i < n; i ++){
ll a;
cin >> a;
W.push_back(a);
}
//KT(d*n) mul V(n*d)
print_mat(mat_mul(Q,mat_mul(trans(K), V)), W);
}