1
+
1
2
const int md = 1e9 + 7 ;
2
3
3
- template <typename T> T sub (T a, T b) { return (1LL *(a-b)%md + md) % md ; }
4
- template <typename T> T add (T a, T b) { return (1LL *(a%md) + 1LL *(b%md)) % md ; }
5
- template <typename T> T mul (T a, T b) { return (1LL *(a%md) * (b%md)) % md ; }
4
+ template <typename T> inline T add (T a, T b, const int & mod ) { return (a+b>=mod)? a+b-mod : a+b ; }
5
+ template <typename T> inline T sub (T a, T b, const int & mod ) { return (a-b< 0 )? a-b+mod : a-b ; }
6
+ template <typename T> inline T mul (T a, T b, const int & mod ) { return (1LL *a*b)%mod ; }
6
7
7
- template <typename T, typename U> T fastpow (T a, U b) {
8
+ template <typename T, typename U> T fastpow (T a, U b, const int & mod ) {
8
9
assert (0 <= b);
9
10
T answer = static_cast <T>(1 );
10
11
while (b > 0 ) {
11
- if (b & 1 ) {
12
- answer = mul (answer, a);
13
- }
14
- a = mul (a, a);
12
+ if (b & 1 ) answer = mul (answer, a, mod);
13
+ a = mul (a, a, mod);
15
14
b >>= 1 ;
16
15
}
17
16
return answer;
18
17
}
19
18
20
- template <typename T> T inverse (T a) {
21
- a %= md ;
22
- if (a < 0 ) a += md ;
23
- T b = md , u = 0 , v = 1 ;
19
+ template <typename T> T inverse (T a, const int & mod ) {
20
+ a %= mod ;
21
+ if (a < 0 ) a += mod ;
22
+ T b = mod , u = 0 , v = 1 ;
24
23
while (a) {
25
24
T t = b / a;
26
25
b -= t * a; swap (a, b);
27
26
u -= t * v; swap (u, v);
28
27
}
29
28
assert (b == 1 );
30
- if (u < 0 ) u += md ;
29
+ if (u < 0 ) u += mod ;
31
30
return u;
32
31
}
33
32
34
- template <typename T> T division (T a, T b) { return mul (a, inverse (b)); }
33
+ template <typename T> T division (T a, T b, const int & mod) { return mul (a, inverse (b, mod), mod); }
34
+
35
+ // Notes:
36
+ // 1) a^(b^(a)) % md
37
+ // is equal to:
38
+ // c++ code:
39
+ // int exponent = fastpow(b, c, md-1);
40
+ // int answer = fastpow(a, exponent, md);
0 commit comments