前言
看到这个,有人会问,乘法运算本来不就是 的吗?快速乘又是一个什么东西?今天这篇博客我们就来了解一下快速乘。
正题
快速乘,顾名思义,是一种能在 时间内求出 的算法
为什么需要用到快速乘呢,例如1e18乘1e18的积对1e9+7取模,而显然1e18乘1e18的值爆出了 的范围,怎么办呢?
可能有学过快速幂的同学知道,可以利用近似于快速幂的思想,把拆分指数用在拆分因数,在 的时间范围内将其拆分并求积,这样每次运算的值都不会超出 。
当然,缺点也很明显,那就是慢!我们称这种算法叫慢速乘。
那么快速乘有怎样实现呢?
首先,快速乘是利用了 舍弃低位且范围保留18位的特点,使我们可以利用 加上 的自动转换功能完成快速乘的运算,详见代码
#include<cstdio>
using namespace std;long long a,b,p;
inline long long ksc(long long a,long long b,long long p)
{
a%=p;b%=p;
long double c=a*b/p;
long long ans=a*b-c*p;//利用了a*b%p=a*b-[b/p]*p的特点
if(ans<0) ans+=p;
if(ans>=p) ans-=p;//特判
return ans;//返回
}
signed main()
{
scanf("%lld%lld%lld",&a,&b,&p);
printf("%lld",ksc(a,b,p));
}