This documentation is automatically generated by online-judge-tools/verification-helper
#include "linear_algebra_matrix/upper_triangular_matrix.hpp"一定次元の上三角行列を表す構造体の実装.現時点では、特に $3 \times 3$ 上三角行列
$\displaystyle
\begin{pmatrix}
a_{00} & a_{01} & a_{02}
0 & a_{11} & a_{12}
0 & 0 & a_{22}
\end{pmatrix}
$
が実装されている.乗算(行列積),単項マイナス,加算,大小比較が定義されている.乗算の実装を毎回手で行わなくて済み,また一般次元の行列を使いまわすより高速に動作する.
using mint = atcoder::modint998244353;
UpperTriangular3d<mint> A{
.a00 = 1,
.a01 = 2,
.a02 = 3,
.a11 = 4,
.a12 = 5,
.a22 = 6,
};
UpperTriangular3d<mint> B{
.a00 = 7,
.a01 = 8,
.a02 = 9,
.a11 = 10,
.a12 = 11,
.a22 = 12,
};
auto C = A * B;
auto D = A + B;
auto E = -A;
#pragma once
template <class T> struct UpperTriangular3d {
static T explicit_init_required() = delete;
T a00 = this->explicit_init_required(), a01 = this->explicit_init_required(),
a02 = this->explicit_init_required();
T a11 = this->explicit_init_required(), a12 = this->explicit_init_required();
T a22 = this->explicit_init_required();
UpperTriangular3d operator*(const UpperTriangular3d &r) const {
return UpperTriangular3d{
.a00 = this->a00 * r.a00,
.a01 = this->a00 * r.a01 + this->a01 * r.a11,
.a02 = this->a00 * r.a02 + this->a01 * r.a12 + this->a02 * r.a22,
.a11 = this->a11 * r.a11,
.a12 = this->a11 * r.a12 + this->a12 * r.a22,
.a22 = this->a22 * r.a22,
};
}
UpperTriangular3d operator-() const {
return UpperTriangular3d{
.a00 = -this->a00,
.a01 = -this->a01,
.a02 = -this->a02,
.a11 = -this->a11,
.a12 = -this->a12,
.a22 = -this->a22,
};
}
UpperTriangular3d operator+(const UpperTriangular3d &r) const {
return UpperTriangular3d{
.a00 = this->a00 + r.a00,
.a01 = this->a01 + r.a01,
.a02 = this->a02 + r.a02,
.a11 = this->a11 + r.a11,
.a12 = this->a12 + r.a12,
.a22 = this->a22 + r.a22,
};
}
auto operator<=>(const UpperTriangular3d &) const = default;
};#line 2 "linear_algebra_matrix/upper_triangular_matrix.hpp"
template <class T> struct UpperTriangular3d {
static T explicit_init_required() = delete;
T a00 = this->explicit_init_required(), a01 = this->explicit_init_required(),
a02 = this->explicit_init_required();
T a11 = this->explicit_init_required(), a12 = this->explicit_init_required();
T a22 = this->explicit_init_required();
UpperTriangular3d operator*(const UpperTriangular3d &r) const {
return UpperTriangular3d{
.a00 = this->a00 * r.a00,
.a01 = this->a00 * r.a01 + this->a01 * r.a11,
.a02 = this->a00 * r.a02 + this->a01 * r.a12 + this->a02 * r.a22,
.a11 = this->a11 * r.a11,
.a12 = this->a11 * r.a12 + this->a12 * r.a22,
.a22 = this->a22 * r.a22,
};
}
UpperTriangular3d operator-() const {
return UpperTriangular3d{
.a00 = -this->a00,
.a01 = -this->a01,
.a02 = -this->a02,
.a11 = -this->a11,
.a12 = -this->a12,
.a22 = -this->a22,
};
}
UpperTriangular3d operator+(const UpperTriangular3d &r) const {
return UpperTriangular3d{
.a00 = this->a00 + r.a00,
.a01 = this->a01 + r.a01,
.a02 = this->a02 + r.a02,
.a11 = this->a11 + r.a11,
.a12 = this->a12 + r.a12,
.a22 = this->a22 + r.a22,
};
}
auto operator<=>(const UpperTriangular3d &) const = default;
};