#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=