This documentation is automatically generated by competitive-verifier/competitive-verifier
#include "tools/modint.hpp"template <typename T>
concept modint = tools::modint_compatible<T>
&& requires(T a) {
{ T::mod() } -> std::same_as<int>;
{ a.val() } -> std::same_as<int>;
};
It is a concept that represents atcoder::static_modint and atcoder::dynamic_modint.
#ifndef TOOLS_MODINT_HPP
#define TOOLS_MODINT_HPP
#include <concepts>
#include <type_traits>
#include "tools/modint_compatible.hpp"
namespace tools {
template <typename T>
concept modint = tools::modint_compatible<T>
&& requires(std::remove_cv_t<T> a) {
{ std::remove_cv_t<T>::mod() } -> std::same_as<int>;
{ a.val() } -> std::same_as<int>;
};
}
#endif
#line 1 "tools/modint.hpp"
#include <concepts>
#include <type_traits>
#line 1 "tools/modint_compatible.hpp"
#line 6 "tools/modint_compatible.hpp"
namespace tools {
template <typename T>
concept modint_compatible = std::regular<std::remove_cv_t<T>>
&& std::equality_comparable<std::remove_cv_t<T>>
&& std::constructible_from<std::remove_cv_t<T>, bool>
&& std::constructible_from<std::remove_cv_t<T>, char>
&& std::constructible_from<std::remove_cv_t<T>, int>
&& std::constructible_from<std::remove_cv_t<T>, long long>
&& std::constructible_from<std::remove_cv_t<T>, unsigned int>
&& std::constructible_from<std::remove_cv_t<T>, unsigned long long>
&& requires(std::remove_cv_t<T> a, std::remove_cv_t<T> b, int v_int, long long v_ll) {
{ std::remove_cv_t<T>::mod() } -> std::convertible_to<int>;
{ std::remove_cv_t<T>::raw(v_int) } -> std::same_as<std::remove_cv_t<T>>;
{ a.val() } -> std::convertible_to<int>;
{ ++a } -> std::same_as<std::remove_cv_t<T>&>;
{ --a } -> std::same_as<std::remove_cv_t<T>&>;
{ a++ } -> std::same_as<std::remove_cv_t<T>>;
{ a-- } -> std::same_as<std::remove_cv_t<T>>;
{ a += b } -> std::same_as<std::remove_cv_t<T>&>;
{ a -= b } -> std::same_as<std::remove_cv_t<T>&>;
{ a *= b } -> std::same_as<std::remove_cv_t<T>&>;
{ a /= b } -> std::same_as<std::remove_cv_t<T>&>;
{ +a } -> std::same_as<std::remove_cv_t<T>>;
{ -a } -> std::same_as<std::remove_cv_t<T>>;
{ a.pow(v_ll) } -> std::same_as<std::remove_cv_t<T>>;
{ a.inv() } -> std::same_as<std::remove_cv_t<T>>;
{ a + b } -> std::same_as<std::remove_cv_t<T>>;
{ a - b } -> std::same_as<std::remove_cv_t<T>>;
{ a * b } -> std::same_as<std::remove_cv_t<T>>;
{ a / b } -> std::same_as<std::remove_cv_t<T>>;
};
}
#line 7 "tools/modint.hpp"
namespace tools {
template <typename T>
concept modint = tools::modint_compatible<T>
&& requires(std::remove_cv_t<T> a) {
{ std::remove_cv_t<T>::mod() } -> std::same_as<int>;
{ a.val() } -> std::same_as<int>;
};
}