proconlib

This documentation is automatically generated by competitive-verifier/competitive-verifier

View the Project on GitHub anqooqie/proconlib

:heavy_check_mark: Concept for atcoder::static_modint and atcoder::dynamic_modint (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.

Constraints

Time Complexity

License

Author

Depends on

Required by

Verified with

Code

#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>;
    };
}


Back to top page