[模板]取模整形

时间:2021-09-06
本文章向大家介绍[模板]取模整形,主要包括[模板]取模整形使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

基于这篇帖子

就只是一个十分简易的模板,连标题都不想打了。

值得注意的是,当有多个整形先乘的时候,不能保证不爆 int,所以使用它的时候最好全部都定义成它。

/**
 * @param MOD used for modulo
 * @param RT the primitive root of @p MOD
*/
template<int MOD, int RT> struct mint {
    int val;
    static const int mod=MOD;
    mint(ll v=0) { val=int(-mod<v && v<mod? v: v%mod); if(val<0) val+=mod; }
    inline friend bool operator ==(const mint& a, const mint& b) { return a.val == b.val; }
    inline friend bool operator !=(const mint& a, const mint& b) { return !(a==b); }
    inline friend bool operator <(const mint& a, const mint& b) { return a.val<b.val; }
    inline friend bool operator >(const mint& a, const mint& b) { return a.val>b.val; }
    inline friend bool operator <=(const mint& a, const mint& b) { return a.val<=b.val; }
    inline friend bool operator >=(const mint& a, const mint& b) { return a.val>=b.val; }
    inline mint& operator +=(const mint& rhs) { return (*this)=mint((*this).val+rhs.val); }
    inline mint& operator -=(const mint& rhs) { return (*this)=mint((*this).val-rhs.val); }
    inline mint& operator *=(const mint& rhs) { return (*this)=mint(1ll*(*this).val*rhs.val); }
    inline mint operator -() const { return mint(-val); }
    inline mint& operator ++() { return (*this)=(*this)+1; }
    inline mint& operator --() { return (*this)=(*this)-1; }
    inline friend mint operator +(mint a, const mint& b) { return a+=b; }
    inline friend mint operator -(mint a, const mint& b) { return a-=b; }
    inline friend mint operator *(mint a, const mint& b) { return a*=b; }
    inline friend mint qkpow(mint a, ll n) {
        mint ret=1; assert(n>=0);
        for(; n; n>>=1, a*=a) if(n&1) ret*=a;
        return ret;
    }
    inline friend mint inverse(mint a) { assert(a!=0); return qkpow(a, mod-2); }
};
using Mint=mint<998244353, 5>;
inline ostream& operator <<(ostream& os, Mint a) { os<<a.val; return os; }

原文地址:https://www.cnblogs.com/Arextre/p/15234465.html