问题是这样的:
求a*b%mod
没了。
难受的是,虽然 a a a和 b b b 都可以用一个变量存下来,但 a ∗ b a*b a∗b很大,不行。
更难受的是, m o d mod mod也很大, a , b a,b a,b 和它取个模也没有用。
于是有了快速乘。
发现它有一个性质,就是这条柿子的结果也是可以用一个变量存下来的。于是可以将 b b b拆开,将这个会爆掉的运算拆开成多个不会爆掉的运算相加。
发现这个问题转化成小学的定义是这样的:
求 b b b 个 a a a 相加的值模mod
发现这个问题有点像快速幂:
求 b b b 个 a a a 相乘的值模mod
所以实现起来跟快速幂是类似的,也就是把乘法换成加法而已。
代码如下:
//a,b的定义如上所述,c是统计结果,d是存2的若干次方个a相加的值
d=a;
while(b>0)
{
if(b%2==1)c=(c+d)%mod;
d=(d+d)%mod;
b/=2;
}
所以我们将一个 O ( 1 ) O(1) O(1)的运算优化成了 O ( l o g ( b ) ) O(log(b)) O(log(b))……
事实上,如果不用快速乘的话,就要用高精度运算了,而高精度一般都会比
O
(
l
o
g
(
b
)
)
O(log(b))
O(log(b))慢 (重点是代码长!)