This documentation is automatically generated by competitive-verifier/competitive-verifier
#include "tools/semiring.hpp"template <typename R>
concept semiring = tools::commutative_monoid<typename R::add> && tools::monoid<typename R::mul> && std::same_as<typename R::add::T, typename R::mul::T>;
It is a concept that represents a semiring. Note that semantic constraints must be guaranteed by the user.
Semantically, you can define that the results of R::add::op and R::mul::op are undefined depending on the arguments.
For example, you can define that integer addition is not defined for overflowing pairs.
<R> satisfies the concept of tools::semiring, the following conditions must also be satisfied.
tools::commutative_monoid<typename R::add> hold.tools::monoid<typename R::mul> hold.R::mul::op(x, R::add::op(y, z)) and R::add::op(R::mul::op(x, y), R::mul::op(x, z)) are defined, R::mul::op(x, R::add::op(y, z)) $=$ R::add::op(R::mul::op(x, y), R::mul::op(x, z)).R::mul::op(R::add::op(x, y), z) and R::add::op(R::mul::op(x, z), R::mul::op(y, z)) are defined, R::mul::op(R::add::op(x, y), z) $=$ R::add::op(R::mul::op(x, z), R::mul::op(y, z)).R::mul::op(R::add::e(), x) and R::mul::op(x, R::add::e()) are defined, R::mul::op(R::add::e(), x) $=$ R::mul::op(x, R::add::e()) = R::add::e().#ifndef TOOLS_SEMIRING_HPP
#define TOOLS_SEMIRING_HPP
#include "tools/commutative_monoid.hpp"
#include "tools/monoid.hpp"
namespace tools {
template <typename R>
concept semiring = tools::commutative_monoid<typename R::add> && tools::monoid<typename R::mul> && std::same_as<typename R::add::T, typename R::mul::T>;
}
#endif
#line 1 "tools/semiring.hpp"
#line 1 "tools/commutative_monoid.hpp"
#line 1 "tools/monoid.hpp"
#include <concepts>
namespace tools {
template <typename M>
concept monoid = requires(typename M::T x, typename M::T y) {
{ M::op(x, y) } -> std::same_as<typename M::T>;
{ M::e() } -> std::same_as<typename M::T>;
};
}
#line 5 "tools/commutative_monoid.hpp"
namespace tools {
template <typename M>
concept commutative_monoid = tools::monoid<M>;
}
#line 6 "tools/semiring.hpp"
namespace tools {
template <typename R>
concept semiring = tools::commutative_monoid<typename R::add> && tools::monoid<typename R::mul> && std::same_as<typename R::add::T, typename R::mul::T>;
}