forked from jacklee1792/templates
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodular.hpp
More file actions
36 lines (29 loc) · 1.44 KB
/
modular.hpp
File metadata and controls
36 lines (29 loc) · 1.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// MODULAR TYPE *************************************************************************
// Addition, subtraction, multiplication
// -> O(1)
// Division:
// -> O(logn)
template<class T,T MOD=1000000007>
struct modular {
T val;
modular(T x=0){val=x%MOD;if(val<0)val+=MOD;}
modular(T a,T b):val(0){*this+=a;*this/=b;}
modular& operator+=(modular const& b){val+=b.val;if(val>=MOD)val-=MOD;return *this;}
modular& operator-=(modular const& b){val-=b.val;if(val<0)val+=MOD;return *this;}
modular& operator*=(modular const& b){val=(long long)val*b.val%MOD;return *this;}
friend modular mpow(modular a,long long x) {
modular ret=1;while(x){if(x&1)ret*=a;a*=a;x>>=1;}
return ret;
}
friend modular inv(modular a){return mpow(a,MOD-2);}
modular& operator/=(modular const& b){return *this*=inv(b);}
friend modular operator+(modular a,modular const b){return a+=b;}
friend modular operator-(modular a,modular const b){return a-=b;}
friend modular operator-(modular const a){return 0-a;}
friend modular operator*(modular a,modular const b){return a*=b;}
friend modular operator/(modular a,modular const b){return a/=b;}
friend ostream& operator<<(ostream& o,modular const& a){return o<<a.val;}
friend bool operator==(modular const& a,modular const& b){return a.val==b.val;}
friend bool operator!=(modular const& a,modular const& b){return a.val!=b.val;}
};
// **************************************************************************************