This documentation is automatically generated by online-judge-tools/verification-helper
This project is maintained by tsutaj
// 行列ライブラリ // 演算子: 複合代入 (+=, -=), 単項 (-), 二項 (+, -, *, ==) // eigen(N): N*N 単位行列を返す // pow(mat, k): mat の k 乗を返す template <typename T, int h, int w> struct FixedMatrix { using array_type = array<T, h * w>; array_type mat; FixedMatrix(T val = T(0)) { mat.fill(val); } const T& at(int i, int j) const { return mat[i*w + j]; } T& at(int i, int j) { return mat[i*w + j]; } FixedMatrix<T, h, w> &operator+=(const FixedMatrix<T, h, w>& rhs) { for(size_t i=0; i<h; i++) { for(size_t j=0; j<w; j++) { this->at(i, j) += rhs.at(i, j); } } return *this; } FixedMatrix<T, h, w> operator-() const { FixedMatrix<T, h, w> res(*this); for(size_t i=0; i<h; i++) { for(size_t j=0; j<w; j++) { res.at(i, j) *= T(-1); } } return res; } FixedMatrix<T, h, w> &operator-=(const FixedMatrix<T, h, w>& rhs) { return (FixedMatrix<T, h, w>(*this) += -rhs); } template <int wr> FixedMatrix<T, h, wr> operator*(const FixedMatrix<T, w, wr>& rhs) { size_t H = h, W = wr, C = w; FixedMatrix<T, h, wr> res; for(size_t i=0; i<H; i++) { for(size_t j=0; j<W; j++) { for(size_t k=0; k<C; k++) { res.at(i, j) += this->at(i, k) * rhs.at(k, j); } } } return res; } FixedMatrix<T, h, w> operator+(const FixedMatrix<T, h, w>& rhs) { return (FixedMatrix<T, h, w>(*this) += rhs); } FixedMatrix<T, h, w> operator-(const FixedMatrix<T, h, w> &rhs) { return (FixedMatrix<T, h, w>(*this) -= rhs); } bool operator==(const FixedMatrix<T, h, w> &rhs) const { return this->mat == rhs.mat; } bool operator!=(const FixedMatrix<T, h, w> &rhs) const { return !(*this == rhs); } }; template <typename T, int h, int w> FixedMatrix<T, h, w> eigen() { FixedMatrix<T, h, w> res(0); for(size_t i=0; i<h; i++) res.at(i, i) = T(1); return res; } template <typename T, int h, int w> FixedMatrix<T, h, w> pow(FixedMatrix<T, h, w> mat, long long int k) { FixedMatrix<T, h, w> res = eigen<T, h, w>(); for(; k>0; k>>=1) { if(k & 1) res = res * mat; mat = mat * mat; } return res; } template <typename T, int h, int w> ostream& operator<< (ostream& out, FixedMatrix<T, h, w> mat) { int H = mat.h, W = mat.w; out << "[" << endl; for(int i=0; i<H; i++) { out << " [ "; for(int j=0; j<W; j++) out << mat.at(i, j) << " "; out << "]" << endl; } out << "]" << endl; return out; }
#line 1 "math/math_024_fixed_matrix.cpp" // 行列ライブラリ // 演算子: 複合代入 (+=, -=), 単項 (-), 二項 (+, -, *, ==) // eigen(N): N*N 単位行列を返す // pow(mat, k): mat の k 乗を返す template <typename T, int h, int w> struct FixedMatrix { using array_type = array<T, h * w>; array_type mat; FixedMatrix(T val = T(0)) { mat.fill(val); } const T& at(int i, int j) const { return mat[i*w + j]; } T& at(int i, int j) { return mat[i*w + j]; } FixedMatrix<T, h, w> &operator+=(const FixedMatrix<T, h, w>& rhs) { for(size_t i=0; i<h; i++) { for(size_t j=0; j<w; j++) { this->at(i, j) += rhs.at(i, j); } } return *this; } FixedMatrix<T, h, w> operator-() const { FixedMatrix<T, h, w> res(*this); for(size_t i=0; i<h; i++) { for(size_t j=0; j<w; j++) { res.at(i, j) *= T(-1); } } return res; } FixedMatrix<T, h, w> &operator-=(const FixedMatrix<T, h, w>& rhs) { return (FixedMatrix<T, h, w>(*this) += -rhs); } template <int wr> FixedMatrix<T, h, wr> operator*(const FixedMatrix<T, w, wr>& rhs) { size_t H = h, W = wr, C = w; FixedMatrix<T, h, wr> res; for(size_t i=0; i<H; i++) { for(size_t j=0; j<W; j++) { for(size_t k=0; k<C; k++) { res.at(i, j) += this->at(i, k) * rhs.at(k, j); } } } return res; } FixedMatrix<T, h, w> operator+(const FixedMatrix<T, h, w>& rhs) { return (FixedMatrix<T, h, w>(*this) += rhs); } FixedMatrix<T, h, w> operator-(const FixedMatrix<T, h, w> &rhs) { return (FixedMatrix<T, h, w>(*this) -= rhs); } bool operator==(const FixedMatrix<T, h, w> &rhs) const { return this->mat == rhs.mat; } bool operator!=(const FixedMatrix<T, h, w> &rhs) const { return !(*this == rhs); } }; template <typename T, int h, int w> FixedMatrix<T, h, w> eigen() { FixedMatrix<T, h, w> res(0); for(size_t i=0; i<h; i++) res.at(i, i) = T(1); return res; } template <typename T, int h, int w> FixedMatrix<T, h, w> pow(FixedMatrix<T, h, w> mat, long long int k) { FixedMatrix<T, h, w> res = eigen<T, h, w>(); for(; k>0; k>>=1) { if(k & 1) res = res * mat; mat = mat * mat; } return res; } template <typename T, int h, int w> ostream& operator<< (ostream& out, FixedMatrix<T, h, w> mat) { int H = mat.h, W = mat.w; out << "[" << endl; for(int i=0; i<H; i++) { out << " [ "; for(int j=0; j<W; j++) out << mat.at(i, j) << " "; out << "]" << endl; } out << "]" << endl; return out; }