#include <iostream>
#include <vector>
using namespace std;

















void mul(
    
        vector<vector<float>> & res,
        vector<vector<float>> & lhs,
        vector<vector<float>> & rhs ) {
    for ( size_t i = 0;
            i < res.size(); i++ )
        for ( size_t j = 0;
                j < res.at(i).size(); j++ ) {
            res.at(i).at(j) = 0.0;
            for ( size_t k = 0;
                    k < rhs.size(); k++ )
                @res.at(i).at(j) +=@
                    @lhs.at(i).at(k) *@
                    @rhs.at(k).at(j);@
        }
}









#ifdef RUNIT


static void zero( vector<vector<float>> & mat ) {
    for ( size_t i = 0; i < mat.size(); i++ )
        for ( size_t j = 0; j < mat.at(i).size(); j++ )
            mat.at(i).at(j) = 0.0;
}


static void fill( vector<vector<float>> & mat ) {
    for ( size_t i = 0; i < mat.size(); i++ )
        for ( size_t j = 0; j < mat.at(i).size(); j++ )
            mat.at(i).at(j) = 1.0 * (i + 1) + 0.1 * (j+1);
}


static void print( vector<vector<float>> & mat ) {
    for ( size_t i = 0; i < mat.size(); i++ ) {
        for ( size_t j = 0; j < mat.at(i).size(); j++ )
            cout << mat.at(i).at(j) << " ";
        cout << endl;
    }
}

#define EXPSZ_M 2
#define EXPSZ_N 3
#define EXPSZ_P 4


int main() {
    vector<vector<float>> res( EXPSZ_M, vector<float>( EXPSZ_N ) );  zero( res );
    vector<vector<float>> lhs( EXPSZ_M, vector<float>( EXPSZ_P ) );  fill( lhs );
    vector<vector<float>> rhs( EXPSZ_P, vector<float>( EXPSZ_N ) );  fill( rhs );
    mul( res, lhs, rhs );
    print(lhs);
    printf("*\n");
    print(rhs);
    printf("=\n");
    print(res);
}



#endif
