快速乘:
1.基本原理:
用来求两个大数的积取模(a*b%c)时我们会用到快速乘取模,其时间复杂度为O(logN).
我们知道当两个大数相乘的时候会爆long long,快速乘其实就是来防止有两个较大的数相乘而直接乘爆, 所以用快速乘, 其原理就是
利用乘法分配律将a*b转化为多个式子相加的形式求解,当然这里的乘法分配律是将b(后面那个数)转化为二进制形式计算。
例如:15*15
因为是加法, 怎么都不可能加爆. 所以目的就是为了防止爆范围.
2.代码:
a*b%p
#include<stdio.h>
int main()
{
long long int a,b,p,rs;
scanf("%lld%lld%lld",&a,&b,&p);
rs=0;
while(b!=0)
{
if(b&1)
{
rs=(rs+a)%p;
}
a=(a+a)%p;
b/=2;
}
printf("%lld\n",rs);
return 0;
}
注:这里的&是位操作中的与操作运算符。
也就是常说的and操作,双目运算符
计算的时候按位计算,&两边操作数对应位上全为1时,结果的该位值为1。否则该位值为0。
3.心得:
通过对快速乘的学习,结合快速幂了解到对于爆long long范围的取模运算,都要将其转化为二进制计算。