:warning: ModInt
(math/mod_int_dynamic.hpp)

Required by

Code

#pragma once
#include<cstdint>
#include<iostream>
#include<vector>

/**
 * @brief ModInt
 */

struct mod_int_dynamic{
    using mint=mod_int_dynamic;
    using u64 = std::uint_fast64_t;
    u64 a;
    mod_int_dynamic(const long long x = 0)noexcept:a(x>=0?x%get_mod():get_mod()-(-x)%get_mod()){}
    u64 &value()noexcept{return a;}
    const u64 &value() const noexcept {return a;}
    mint operator+(const mint rhs)const noexcept{return mint(*this) += rhs;}
    mint operator-(const mint rhs)const noexcept{return mint(*this)-=rhs;}
    mint operator*(const mint rhs) const noexcept {return mint(*this) *= rhs;}
    mint operator/(const mint rhs) const noexcept {return mint(*this) /= rhs;}
    mint &operator+=(const mint rhs) noexcept {
        a += rhs.a;
        if (a >= get_mod())a -= get_mod();
        return *this;
    }
    mint &operator-=(const mint rhs) noexcept {
        if (a<rhs.a)a += get_mod();
        a -= rhs.a;
        return *this;
    }
    mint &operator*=(const mint rhs) noexcept {
        a = a * rhs.a % get_mod();
        return *this;
    }
    mint operator++(int) noexcept {
        a += 1;
        if (a >= get_mod())a -= get_mod();
        return *this;
    }
    mint operator--(int) noexcept {
        if (a<1)a += get_mod();
        a -= 1;
        return *this;
    }
    mint &operator/=(mint rhs) noexcept {
        u64 exp=get_mod()-2;
        while (exp) {
            if (exp % 2) {
                *this *= rhs;
            }
            rhs *= rhs;
            exp /= 2;
        }
        return *this;
    }
    bool operator==(mint x) noexcept {
        return a==x.a;
    }
    bool operator!=(mint x) noexcept {
        return a!=x.a;
    }
    bool operator<(mint x) noexcept {
        return a<x.a;
    }
    bool operator>(mint x) noexcept {
        return a>x.a;
    }
    bool operator<=(mint x) noexcept {
        return a<=x.a;
    }
    bool operator>=(mint x) noexcept {
        return a>=x.a;
    }
    static int root(){
        mint root = 2;
        while(root.pow((get_mod()-1)>>1).a==1)root++;
        return root.a;
    }
    mint pow(long long n)const{
        long long x=a;
        mint ret = 1;
        while(n>0) {
            if(n&1)(ret*=x);
            (x*=x)%=get_mod();
            n>>=1;
        }
        return ret;
    }
    mint inv(){
        return pow(get_mod()-2);
    }
    friend std::ostream& operator<<(std::ostream& lhs, const mint& rhs) noexcept {
        lhs << rhs.a;
        return lhs;
    }
    friend std::istream& operator>>(std::istream& lhs,mint& rhs) noexcept {
        lhs >> rhs.a;
        return lhs;
    }
    constexpr static bool is_static=false;
    static int MOD;
    static u64 get_mod(){
        return MOD;
    }
    static void set_mod(int mod){
        MOD=mod;
    }
};
int mod_int_dynamic::MOD=-1;
#line 2 "math/mod_int_dynamic.hpp"
#include<cstdint>
#include<iostream>
#include<vector>

/**
 * @brief ModInt
 */

struct mod_int_dynamic{
    using mint=mod_int_dynamic;
    using u64 = std::uint_fast64_t;
    u64 a;
    mod_int_dynamic(const long long x = 0)noexcept:a(x>=0?x%get_mod():get_mod()-(-x)%get_mod()){}
    u64 &value()noexcept{return a;}
    const u64 &value() const noexcept {return a;}
    mint operator+(const mint rhs)const noexcept{return mint(*this) += rhs;}
    mint operator-(const mint rhs)const noexcept{return mint(*this)-=rhs;}
    mint operator*(const mint rhs) const noexcept {return mint(*this) *= rhs;}
    mint operator/(const mint rhs) const noexcept {return mint(*this) /= rhs;}
    mint &operator+=(const mint rhs) noexcept {
        a += rhs.a;
        if (a >= get_mod())a -= get_mod();
        return *this;
    }
    mint &operator-=(const mint rhs) noexcept {
        if (a<rhs.a)a += get_mod();
        a -= rhs.a;
        return *this;
    }
    mint &operator*=(const mint rhs) noexcept {
        a = a * rhs.a % get_mod();
        return *this;
    }
    mint operator++(int) noexcept {
        a += 1;
        if (a >= get_mod())a -= get_mod();
        return *this;
    }
    mint operator--(int) noexcept {
        if (a<1)a += get_mod();
        a -= 1;
        return *this;
    }
    mint &operator/=(mint rhs) noexcept {
        u64 exp=get_mod()-2;
        while (exp) {
            if (exp % 2) {
                *this *= rhs;
            }
            rhs *= rhs;
            exp /= 2;
        }
        return *this;
    }
    bool operator==(mint x) noexcept {
        return a==x.a;
    }
    bool operator!=(mint x) noexcept {
        return a!=x.a;
    }
    bool operator<(mint x) noexcept {
        return a<x.a;
    }
    bool operator>(mint x) noexcept {
        return a>x.a;
    }
    bool operator<=(mint x) noexcept {
        return a<=x.a;
    }
    bool operator>=(mint x) noexcept {
        return a>=x.a;
    }
    static int root(){
        mint root = 2;
        while(root.pow((get_mod()-1)>>1).a==1)root++;
        return root.a;
    }
    mint pow(long long n)const{
        long long x=a;
        mint ret = 1;
        while(n>0) {
            if(n&1)(ret*=x);
            (x*=x)%=get_mod();
            n>>=1;
        }
        return ret;
    }
    mint inv(){
        return pow(get_mod()-2);
    }
    friend std::ostream& operator<<(std::ostream& lhs, const mint& rhs) noexcept {
        lhs << rhs.a;
        return lhs;
    }
    friend std::istream& operator>>(std::istream& lhs,mint& rhs) noexcept {
        lhs >> rhs.a;
        return lhs;
    }
    constexpr static bool is_static=false;
    static int MOD;
    static u64 get_mod(){
        return MOD;
    }
    static void set_mod(int mod){
        MOD=mod;
    }
};
int mod_int_dynamic::MOD=-1;
Back to top page