快速乘

快速乘

当我们要求ab%p的值的时候,如果是用普通的乘法来算的话,当ab很大的时候,就容易爆long long;这个时候我们就要用到一个极好的方法:快速乘

原理
快速乘是利用乘法分配律将a*b分解成多个式子相加(将后面一个乘数转化为二进制的形式计算)求解。例如:

12*11=12*1011(2)=12*2^3*1+12*2^2*0+12*2^1+12*2^0=96+24+12=132

看看代码:

LL ksc(LL a,LL b,LL p)//快速乘函数,LL为long long int
{
    LL ans=0;//因为是加法,所以赋初值为0
    while(b!=0)
    {
        if(b%2==1)//如果b为奇数,既b转化为二进制中的某位为1
            ans=(ans+a)%p;//就加上a,相当于乘法分配率中相加的步骤
        a=(a+a)%p;//相当于a不断乘2,乘以b的二进制的某位
        b=b/2;//转化为二进制
    }
    return ans;
}

这个是一边加一边取模的,就不会出现超范围的情况。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值