定义
快速乘和快速幂的思路基本一致,为什么要用快速乘?一般快速乘是用于
a * b%c的算法(a,b,c)是较大的数,因为a和b都是较大的数比如长整
型( long long )。相乘的俩个数过大就会溢出,就会和需要的答案不符合,
这个时候就需要运用到快速乘,来把俩个需要相乘的数乘起来,而且不会
溢出,因为会需要取模一个数c。
快速乘
快速乘的思想就是化为二进制,列如:
12 * 13=12 * (1101)B = 12 * 23 + 12 * 22 + 12 * 20
接下来看代码:
#define LL long long
LL mult_mod(LL a,LL b)
{
LL ans=0; //注意此处初始化
while(b)
{
if(b&1)ans=ans+a;//b的最后一位为1,就将此时的a加上
a=(a+a); //注意此处是加不是乘
b=b>>2;//将b二进制往右移动一位
}
return ans;
}
此代码和快速幂是不是超级类似。现在说一下取模的操作,首先你需要知道这个取模公式:
(a+b)%c=(a%c+b%c)%c,所以如果需要取模就在后面加个取模就行了
下面假设取模的c是131
LL mult_mod(LL a,LL b)
{
LL ans=0;
while(b)
{
if(b&1)ans=(ans+a)%131;
a=(a+a)%131;
b=b>>2;
}
return ans;
}
下面再悄悄说一个简单方法,不过限定是c++语言:
long long ans=((__int128)x*y)%p;
此变量类型是c++自带的一个数据类型,可以包含2128大小的数,所以用c++的
小伙伴可以直接拿来乘就OK了。