Y
K
N
U
F

MODint(自动取模 int)

主要来自here,我就只是补充一点东西,修改一点东西。(还删了点东西)

具体的:降低了稳定性,提高了一定效率,加了几个无用的功能,增加了大量报错(但是不影响使用)。

建议和我的快读一同使用,兼容的。

in兼容,不过建议in(a.val),快一些。建议out(a.val),否则一个非 \(10^n\) 数直接死循环。

不行的话也有流输入输出的兼容。

除法是 \(O(\log mod)\) 的,嫌慢可以自行修改 inv() 函数内容。

template <int MOD> struct modint {
    int val;
    static int norm(const int& x) { return x < 0 ? x + MOD : x; }
    static constexpr int get_mod() { return MOD; }
    modint inv() const {
        assert(val);
        int a = val, b = MOD, u = 1, v = 0, t;
        while (b > 0) t = a / b, swap(a -= t * b, b), swap(u -= t * v, v);
        assert(!b);
        return modint(u);
    }
    modint() {}
    modint(const int& m) : val(norm(m % MOD)) {}
    modint(const long long& m) : val(norm(m % MOD)) {}
	template<typename T> modint(const T m) : val(norm((long long)m % MOD)) {}
	// template<class T> operator T() const { return val; }
    modint operator-() const { return modint(norm(-val)); }
	modint operator!() const { return !val; }
	modint operator~() const { return norm(~val); } 
    modint &operator++() { return (++ this->val) >= MOD ? (this->val -= MOD), *this : *this; }
    modint &operator--() { return (-- this->val) < 0 ? (this->val += MOD), *this : *this; }
    modint operator++(int) { return norm((++ *this).val - 1); }
    modint operator--(int) { return norm((-- *this).val + 1); }
	bool operator!=(const modint& o) { return val != o.val; }
    bool operator==(const modint& o) { return val == o.val; }
    bool operator<(const modint& o) { return val < o.val; }
    bool operator>(const modint& o) { return val > o.val; }
    bool operator<=(const modint& o) { return val <= o.val; }
    bool operator>=(const modint& o) { return val >= o.val; }
    modint& operator+=(const modint& o) { return val = (1ll * val + o.val) % MOD, *this; }
    modint& operator-=(const modint& o) { return val = norm(1ll * val - o.val), *this; }
    modint& operator*=(const modint& o) { return val = static_cast<int>(1ll * val * o.val % MOD), *this; }
    modint& operator/=(const modint& o) { return *this *= o.inv(); }
    modint& operator%=(const modint& o) { assert(o.val); return val %= o.val, *this; }
    modint& operator^=(const modint& o) { return val ^= o.val, *this; }
    modint& operator>>=(const modint& o) { return val >>= o.val, *this; }
    modint& operator<<=(const modint& o) { return (val <<= o.val) %= MOD, *this; }
    modint operator-(const modint& o) const { return modint(*this) -= o; }
    modint operator+(const modint& o) const { return modint(*this) += o; }
    modint operator*(const modint& o) const { return modint(*this) *= o; }
    modint operator/(const modint& o) const { return modint(*this) /= o; }
    modint operator%(const modint& o) const { return modint(*this) %= o; }
    modint operator^(const modint& o) const { return modint(*this) ^= o; }
    modint operator>>(const modint& o) const { return modint(*this) >>= o; }
    modint operator<<(const modint& o) const { return modint(*this) <<= o; }
    friend std::istream& operator>>(std::istream& is, modint& a) {
        long long v;
        return is >> v, a.val = norm(v % MOD), is;
    }
    friend std::ostream& operator<<(std::ostream& os, const modint& a) { return os << a.val; }
    friend std::string tostring(const modint& a) { return std::to_string(a.val); }
};
using mint = modint<1000000007>;
posted @ 2025-09-16 21:45  樓影沫瞬_17Hz  阅读(25)  评论(0)    收藏  举报