浅谈快速乘

前言

看到这个,有人会问,乘法运算本来不就是 O ( 1 ) 的吗?快速乘又是一个什么东西?今天这篇博客我们就来了解一下快速乘。

正题

快速乘,顾名思义,是一种能在 O ( 1 ) 时间内求出 a × b   m o d p 的算法

为什么需要用到快速乘呢,例如1e18乘1e18的积对1e9+7取模,而显然1e18乘1e18的值爆出了 l o n g   l o n g 的范围,怎么办呢?

可能有学过快速幂的同学知道,可以利用近似于快速幂的思想,把拆分指数用在拆分因数,在 l o g b 的时间范围内将其拆分并求积,这样每次运算的值都不会超出 l o n g   l o n g

当然,缺点也很明显,那就是慢!我们称这种算法叫慢速乘。

那么快速乘有怎样实现呢?

首先,快速乘是利用了 l o n g   d o u b l e 舍弃低位且范围保留18位的特点,使我们可以利用 l o n g   d o u b l e 加上 C + + 的自动转换功能完成快速乘的运算,详见代码

#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));
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81623511