This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub noshi91/Library
template <class T> class affine { public: T a; T b; constexpr affine(const T &a = 1, const T &b = 0) noexcept : a(a), b(b) {} constexpr T evaluate(const T &x) const noexcept { return x * a + b; } friend constexpr affine operator+(const affine &l, const affine &r) noexcept { return affine(l.a + r.a, l.b + r.b); } constexpr affine composite(const affine &r) const noexcept { return affine(a * r.a, b * r.a + r.b); } }; template <class T> class affine_composite_monoid { public: using value_type = affine<T>; static constexpr value_type operation(const value_type &l, const value_type &r) noexcept { return l.composite(r); } static constexpr value_type identity{}; };
#line 1 "other/affine.cpp" template <class T> class affine { public: T a; T b; constexpr affine(const T &a = 1, const T &b = 0) noexcept : a(a), b(b) {} constexpr T evaluate(const T &x) const noexcept { return x * a + b; } friend constexpr affine operator+(const affine &l, const affine &r) noexcept { return affine(l.a + r.a, l.b + r.b); } constexpr affine composite(const affine &r) const noexcept { return affine(a * r.a, b * r.a + r.b); } }; template <class T> class affine_composite_monoid { public: using value_type = affine<T>; static constexpr value_type operation(const value_type &l, const value_type &r) noexcept { return l.composite(r); } static constexpr value_type identity{}; };