取余运算
x % u
等价于 x - floor(x/u) * u
算术求模 mod(x, u)
x mod u
等价于 ((x % u) + x) % x
a = b x q + r (只要 b > 0 b > 0 b>0, 必有 r ≥ 0 r\ge0 r≥0 )
一个较大的数m与一个较小的数n求mod(m,n)
限制: m
>
>
> INT_MAX, n
≤
\le
≤ INT_MAX
利用秦九韶公式写法进行思考,
123
=
(
(
0
∗
10
+
1
)
+
2
)
∗
10
)
+
3
)
∗
10
123 = ((0 * 10 + 1) + 2) * 10) + 3) * 10
123=((0∗10+1)+2)∗10)+3)∗10
int mod(const string& m, int n) {
int last = 0;
int ans = 0;
for (int i = 0; i != m.size(); ++i) {
ans = (last * 10 + (m[i] - '0')) % n;
last = ans;
}
return ans;
}
幂求模 m o d ( a n , n ) mod(a^n, n) mod(an,n)
思路: 取模的等价运算, 即 ( a ∗ b ) % n (a*b) \% n (a∗b)%n 等价 ( a % 10 ) ∗ ( b % 10 ) (a \% 10)*(b \% 10) (a%10)∗(b%10)
int mod(int a, int n, int m) {
int ans = 1;
for (int i = 0; i != n; ++i) {
ans = (ans * a) % m;
}
return ans;
}
引入快速幂运算
int mod(int a, int n, int m) {
if (n == 0) return 1;
int tmp = mod(a, n / 2, m);
tmp = (tmp * tmp) % m;
if (n & 1) return (tmp * a) % m;
return tmp;
}
迭代版本:
int mod(int a, int n, int m) {
int ans = 1;
int base = a;
for (int i = n; i > 0; i /= 2) {
if (i & 1) ans = (ans * base) % m;
base = (base * base) % m;
}
return ans;
}