22
33/* *
44 * Author: Teetat T.
5- * Date: 2024-03-17
5+ * Date: 2026-04-15
66 * Description: modular arithmetic operations
77 */
88
9- template <int M ,int root=0 >
9+ template <int mod ,int root=0 >
1010struct ModInt {
1111 using mint = ModInt;
12+
13+ static_assert (mod>0 ," mod must be positive" );
14+
1215 int x;
16+
1317 constexpr ModInt ():x(0 ){}
14- constexpr ModInt (ll x):x(norm(x%get_mod())){}
15- static int Mod;
16- static constexpr int get_mod (){return M>0 ?M:Mod;}
17- static constexpr void set_mod (int Mod_){Mod=Mod_;}
18- static constexpr mint get_root (){return mint (root);}
19- constexpr int norm (int x)const {if (x<0 )x+=get_mod ();if (x>=get_mod ())x-=get_mod ();return x;}
20- explicit constexpr operator int ()const {return x;}
21- constexpr mint operator -()const {return mint ()-mint (*this );};
22- constexpr mint operator +()const {return mint (*this );};
23- constexpr mint inv ()const {
24- int a=x,b=get_mod (),u=1 ,v=0 ,q=0 ;
18+ constexpr ModInt (ll x):x((x%=mod)<0?x+mod:x){}
19+ explicit operator int ()const {return x;}
20+ constexpr static int get_mod (){return mod;}
21+ constexpr static mint get_root (){return mint (root);}
22+
23+ mint operator -()const {
24+ mint res;
25+ res.x =x?mod-x:0 ;
26+ return res;
27+ }
28+ mint operator +()const {return *this ;}
29+
30+ mint inv ()const {
31+ int a=x,b=mod,u=1 ,v=0 ,q=0 ;
2532 while (b>0 ){
2633 q=a/b;
27- a-=q*b;
28- u-=q*v;
29- swap (a,b);
30- swap (u,v);
34+ swap (a-=q*b,b);
35+ swap (u-=q*v,v);
3136 }
3237 return mint (u);
3338 }
34- constexpr int mul (int a,int b)const {return 1LL *a*b%get_mod ();}
35- constexpr mint &operator +=(const mint &rhs){x=norm (x+rhs.x );return *this ;}
36- constexpr mint &operator -=(const mint &rhs){x=norm (x-rhs.x );return *this ;}
37- constexpr mint &operator *=(const mint &rhs){x=mul (x,rhs.x );return *this ;}
38- constexpr mint &operator /=(const mint &rhs){x=mul (x,rhs.inv ().x );return *this ;}
39- constexpr mint &operator ++(){return *this +=1 ;}
40- constexpr mint &operator --(){return *this -=1 ;}
41- constexpr mint operator ++(int ){mint res=*this ;*this +=1 ;return res;}
42- constexpr mint operator --(int ){mint res=*this ;*this -=1 ;return res;}
43- friend constexpr mint operator +(mint lhs,const mint &rhs){return lhs+=rhs;}
44- friend constexpr mint operator -(mint lhs,const mint &rhs){return lhs-=rhs;}
45- friend constexpr mint operator *(mint lhs,const mint &rhs){return lhs*=rhs;}
46- friend constexpr mint operator /(mint lhs,const mint &rhs){return lhs/=rhs;}
39+ mint pow (ll n)const {
40+ mint res=1 ,a=*this ;
41+ for (;n>0 ;a*=a,n>>=1 )if (n&1 )res*=a;
42+ return res;
43+ }
44+ mint &operator +=(const mint &o){
45+ if ((x+=o.x )>=mod)x-=mod;
46+ return *this ;
47+ }
48+ mint &operator -=(const mint &o){
49+ if ((x-=o.x )<0 )x+=mod;
50+ return *this ;
51+ }
52+ mint &operator *=(const mint &o){
53+ x=(ll (x)*o.x )%mod;
54+ return *this ;
55+ }
56+ mint &operator /=(const mint &o){
57+ return *this *=o.inv ();
58+ }
59+
60+ mint operator +(const mint &o)const {return mint (*this )+=o;}
61+ mint operator -(const mint &o)const {return mint (*this )-=o;}
62+ mint operator *(const mint &o)const {return mint (*this )*=o;}
63+ mint operator /(const mint &o)const {return mint (*this )/=o;}
64+
65+ mint &operator ++(){return *this +=mint (1 );}
66+ mint &operator --(){return *this -=mint (1 );}
67+ mint operator ++(int ){mint res=*this ;*this +=mint (1 );return res;}
68+ mint operator --(int ){mint res=*this ;*this -=mint (1 );return res;}
69+
70+ bool operator ==(const mint &o)const {return x==o.x ;}
71+ bool operator !=(const mint &o)const {return x!=o.x ;}
72+ bool operator <(const mint &o)const {return x<o.x ;}
73+
4774 friend istream &operator >>(istream &is,mint &o){ll x{};is>>x;o=mint (x);return is;}
4875 friend ostream &operator <<(ostream &os,const mint &o){return os<<o.x ;}
49- friend constexpr bool operator ==(const mint &lhs,const mint &rhs){return lhs.x ==rhs.x ;}
50- friend constexpr bool operator !=(const mint &lhs,const mint &rhs){return lhs.x !=rhs.x ;}
51- friend constexpr bool operator <(const mint &lhs,const mint &rhs){return lhs.x <rhs.x ;} // for std::map
5276};
53- using mint32 = ModInt<0 >;
54- template <>
55- int mint32::Mod=int (1e9 )+7 ;
56-
77+ using mint998 = ModInt<998244353 ,3 >;
78+ using mint107 = ModInt<1000000007 >;
0 commit comments