#include<iostream>
    #include<vector>
 
    template <typename T> struct Polynomial { std::vector<T> data; };
 
    template <typename T> 
    std::ostream& operator<<(std::ostream& o,const Polynomial<T>& pol) {
    	const auto& data = pol.data;
    	auto power = [](int n){ 
            return (n==0) ? "" : (n==1) ? "x" : "x^" + std::to_string(n);
        };
    	auto sign = [&](int i){ 
    		return (pol.data[i]<0 || i==pol.data.size()-1) ? "" : "+";
    	}; 
    	// RELY ON UNSIGNED OVERFLOW FOR THE LOOP CONDITION !!!
        for (size_t i = pol.data.size()-1; i < pol.data.size(); i-- ) {
            o << sign(i) << pol.data[i] << power(i); 
        }
        return o;
    }
//
template <typename T> struct Matrix {
      using element_type = T;
      using row_type = std::vector<element_type> ;
      using data_type = std::vector<row_type> ;
      Matrix(int rows, int cols, T const & init) : data(data_type(rows,row_type(cols,init))) {}
      data_type data;
};
 
    template <typename T> std::ostream& operator<<(std::ostream& o,const std::vector<T>& v) {
    	for (auto& x : v) o << x << "\t";
    	return o;
    }
    template <typename T> std::ostream& operator<<(std::ostream& o,const Matrix<T>& mat) {
    	for (const auto& row : mat.data) o << row << "\n";
    	return o;
    }
 
    int main() { 
      using Matrix = Matrix<Polynomial<double>>;
      Polynomial<double> p1{{1,2}};
      Matrix mp(2,3,p1);
      std::cout << mp;
      return 0;
    }
				ICAgICNpbmNsdWRlPGlvc3RyZWFtPgogICAgI2luY2x1ZGU8dmVjdG9yPgogICAgCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFBvbHlub21pYWwgeyBzdGQ6OnZlY3RvcjxUPiBkYXRhOyB9OwogICAgCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gCiAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvLGNvbnN0IFBvbHlub21pYWw8VD4mIHBvbCkgewogICAgCWNvbnN0IGF1dG8mIGRhdGEgPSBwb2wuZGF0YTsKICAgIAlhdXRvIHBvd2VyID0gW10oaW50IG4peyAKICAgICAgICAgICAgcmV0dXJuIChuPT0wKSA/ICIiIDogKG49PTEpID8gIngiIDogInheIiArIHN0ZDo6dG9fc3RyaW5nKG4pOwogICAgICAgIH07CiAgICAJYXV0byBzaWduID0gWyZdKGludCBpKXsgCiAgICAJCXJldHVybiAocG9sLmRhdGFbaV08MCB8fCBpPT1wb2wuZGF0YS5zaXplKCktMSkgPyAiIiA6ICIrIjsKICAgIAl9OyAKICAgIAkvLyBSRUxZIE9OIFVOU0lHTkVEIE9WRVJGTE9XIEZPUiBUSEUgTE9PUCBDT05ESVRJT04gISEhCiAgICAgICAgZm9yIChzaXplX3QgaSA9IHBvbC5kYXRhLnNpemUoKS0xOyBpIDwgcG9sLmRhdGEuc2l6ZSgpOyBpLS0gKSB7CiAgICAgICAgICAgIG8gPDwgc2lnbihpKSA8PCBwb2wuZGF0YVtpXSA8PCBwb3dlcihpKTsgCiAgICAgICAgfQogICAgICAgIHJldHVybiBvOwogICAgfQovLwp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IE1hdHJpeCB7CiAgICAgIHVzaW5nIGVsZW1lbnRfdHlwZSA9IFQ7CiAgICAgIHVzaW5nIHJvd190eXBlID0gc3RkOjp2ZWN0b3I8ZWxlbWVudF90eXBlPiA7CiAgICAgIHVzaW5nIGRhdGFfdHlwZSA9IHN0ZDo6dmVjdG9yPHJvd190eXBlPiA7CiAgICAgIE1hdHJpeChpbnQgcm93cywgaW50IGNvbHMsIFQgY29uc3QgJiBpbml0KSA6IGRhdGEoZGF0YV90eXBlKHJvd3Mscm93X3R5cGUoY29scyxpbml0KSkpIHt9CiAgICAgIGRhdGFfdHlwZSBkYXRhOwp9OwogICAgCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgbyxjb25zdCBzdGQ6OnZlY3RvcjxUPiYgdikgewogICAgCWZvciAoYXV0byYgeCA6IHYpIG8gPDwgeCA8PCAiXHQiOwogICAgCXJldHVybiBvOwogICAgfQogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG8sY29uc3QgTWF0cml4PFQ+JiBtYXQpIHsKICAgIAlmb3IgKGNvbnN0IGF1dG8mIHJvdyA6IG1hdC5kYXRhKSBvIDw8IHJvdyA8PCAiXG4iOwogICAgCXJldHVybiBvOwogICAgfQogICAgCiAgICBpbnQgbWFpbigpIHsgCiAgICAgIHVzaW5nIE1hdHJpeCA9IE1hdHJpeDxQb2x5bm9taWFsPGRvdWJsZT4+OwogICAgICBQb2x5bm9taWFsPGRvdWJsZT4gcDF7ezEsMn19OwogICAgICBNYXRyaXggbXAoMiwzLHAxKTsKICAgICAgc3RkOjpjb3V0IDw8IG1wOwogICAgICByZXR1cm4gMDsKICAgIH0=