🍋前言:
- 一学就会的小技巧(一):前缀和
- 一学就会的小技巧(二):差分
- 一学就会的小技巧(三):快速幂
- 一学就会的小技巧(五):矩阵快速幂
- 一学就会的小技巧(六):矩阵快速幂的应用
- 数论基础—素数筛、最大公约数、最小公倍数
- 省赛真题—K倍区间(前缀和,数学,思维)
🌵🌵上一篇文章中我们已经学会了快速幂这个技巧,从快速幂中还可以拓展出龟速乘;龟速乘用来在计算
(
a
×
b
)
m
o
d
p
(a \times{b}) \mod p
(a×b)modp时,防止计算途中因数据过大导致爆long long
。
🍉龟速乘:
👩🏻🏫龟速乘这个技巧和它的名字一样,时间复杂度为 O ( l o g N ) O(logN) O(logN)。明明能直接算乘法,还要来个龟速~不过慢工出细活,结合上篇提到的同余定理,可以解决两数直接相乘再取模可能导致的数据溢出。
🚕以 3 × 10 m o d 4 3 \times{10} \mod{4} 3×10mod4为例,看看如何进行龟速乘:
🚕和快速幂类似,将 3 × 10 3 \times 10 3×10的其中一个因子写成二进制形式 3 × ( 1010 ) 2 3 \times{(1010)_2} 3×(1010)2,那么可以得到:
3 × 10 = ( 3 × 1 ) × 0 + ( 3 × 2 ) × 1 + ( 3 × 4 ) × 0 + ( 3 × 8 ) × 1 3 \times 10 = (3 \times{1}) \times 0 + (3 \times{2}) \times 1 + (3 \times{4}) \times 0 + (3 \times{8}) \times 1 3×10=(3×1)×0+(3×2)×1+(3×4)×0+(3×8)×1
即 : 3 × 10 = 3 × 2 + 3 × 8 即:3 \times 10 = 3 \times 2 + 3 \times8 即:3×10=3×2+3×8
🚕发现同样可以利用二进制的运算特点,那么我们只需要将快速幂的乘法换成加法即可~
🚕取模运算由同余定理,同样也和快速幂一样,可以将模运算加入到每一次计算中,其实就是快速幂的模板改了个运算符号😎
🍦模板代码(Java):
public class Main {
public static long fastMultiply(long a, long b, long p) {
long res = 0;
while (b > 0) {
if ((b & 1) == 1)
res = (res + a) % p;
a = (a + a) % p;
b = b >> 1;
}
return res;
}
public static void main(String[] args) {
System.out.println(fastMultiply(5211251314L, 1251314125, 2022331));
}
}
- 结果:731399,用计算器试一下计算结果正确(~ ̄▽ ̄)~
🍌🍌🍌
本文介绍了第四个小技巧——龟速乘,用来防止计算乘法时爆long long,方法与快速幂类似,可见快速幂的重要性~
🍍🍍🍍
创作不易,如果觉得本文对你有所帮助的话请动动小手,给博主点个免费的赞吧。🙇🏻♀️
🍉🍉🍉
@作者:Mymel_晗,计科专业大学牲一枚,请大佬们多多关照~