快速乘

问题是这样的:

求a*b%mod

没了。

难受的是,虽然 a a a b b b 都可以用一个变量存下来,但 a ∗ b a*b ab很大,不行。

更难受的是, 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))(重点是代码长!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值