📅  最后修改于: 2023-12-03 15:26:51.421000             🧑  作者: Mango
在计算机程序中,经常需要对防止数字过大而进行取模操作。一种常用的模数是 10^9+7,即1000000007。
使用 $10^9+7$ 作为模数有很多好处:
在计算中,常常需要使用到以下两种操作:
两个数相加后取模可以写成 $(a + b) \mod M$。使用本题的模数 10^9+7,应该使用以下代码实现加法取模:
int add_mod(int a, int b, int M) {
int res = (a + b) % M;
if(res < 0) res += M;
return res;
}
两个数相乘后取模可以写成 $(a*b) \mod M$。使用本题的模数 10^9+7,应该使用以下代码实现乘法取模:
int mul_mod(int a, int b, int M) {
return (int)(((long long)a * b) % M);
}
上述代码使用 long long 类型的变量避免了在计算过程中数值超过 int 范围的问题。
快速幂算法是一种用于快速计算 $x^y$的算法,通过反复平方法可以将时间复杂度从 $O(y)$ 优化到 $O(\log y)$。在计算模数时,应该使用快速幂算法在 $O(\log y)$ 的时间内计算结果。
使用本题的模数 10^9+7,应该使用以下代码实现快速幂:
int pow_mod(int x, int y, int M) {
int res = 1;
while(y) {
if(y & 1) res = mul_mod(res, x, M);
x = mul_mod(x, x, M);
y >>= 1;
}
return res;
}
上述代码中 & 表示按位与运算,不重要于本题,请自行了解。上述代码中使用了 mul_mod 函数计算乘法取模,使用了右移运算符 >> 表示除以2的整除。
在进行加法取模和乘法取模时,有可能得到结果为负数。为了与其他语言的实现相兼容,应该将这些负数转为非负数。转换方法如下:
if(res < 0) res += M;
在使用模数计算时,应该始终注意下列事项: