快速乘
当我们要求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;
}
这个是一边加一边取模的,就不会出现超范围的情况。