cplib-cpp

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub hitonanode/cplib-cpp

:heavy_check_mark: Upper triangular matrix (定数次元上三角行列)
(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;

問題例

Verified with

Code

#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;
};
Back to top page