#include <iostream.h>
#include <vector>

typedef vector<double> OneDimVector;
typedef vector<OneDimVector> TwoDimVector;
class Matrix : public TwoDimVector
{
public:
  Matrix(unsigned rows, unsigned columns);
  void Print(ostream & out) const;
  unsigned Rows() const
  {return myRows;}
  int Columns() const
  {return myColumns;}
  Matrix operator*(const Matrix & mat2);
  Matrix& operator=(const Matrix & mat2);
private:
  unsigned myRows, myColumns;
};

inline Matrix::Matrix(unsigned rows, unsigned columns)
: TwoDimVector( rows, OneDimVector(columns, 0.0) )
{myRows = rows; myColumns = columns;}

Matrix & Matrix::operator=(const Matrix & mat2)
{
  TwoDimVector::operator=(mat2);
  myRows = mat2.Rows();
  myColumns = mat2.Columns();
  return *this;
}

void Matrix::Print(ostream & out) const
{

  for (int i = 0; i < Rows(); i++)
    {
      for (int j = 0; j < Columns(); j++)
	out << (*this)[i][j] << '\t';
      out << endl;
    }
  
}

Matrix Matrix::operator*(const Matrix & mat2)
{
  Matrix prod(myRows, mat2.Columns());
  for (int i = 0; i < myRows; i++)
    {
      for (int j = 0; j < mat2.Columns(); j++)
	{
	  double sum = 0.0;
	  for (int k = 0; k < myColumns; k++)
	    sum += (*this)[i][k] * mat2[k][j];
	  prod[i][j] = sum;
	}
    }
  return prod;
}

int main()
{
  Matrix a(2,3), b(3,4), c(2, 4);
  for (int i = 0; i < 2; i++)
    for (int j = 0; j < 3; j++)
      cin >> a[i][j];
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 4; j++)
      cin >> b[i][j];
  
  a.Print(cout);
  cout << "rows " << a.Rows() << endl;
  cout << "columns " << b.Columns() << endl;
  b.Print(cout);
  c = a*b;
  c.Print(cout);

}


