当前位置:首页 > C++目录 > 正文内容

【数论】快速乘

亿万年的星光3年前 (2023-02-04)C++目录19689

上一篇文章简单说了龟速乘的问题,有人觉得龟速乘还是太慢了,有没有什么办法再快一点,实际是有的,就是我们今天介绍的 快速乘

快速乘的原理和龟速乘不同,快速乘并不是基于二进制和位运算,严格来说,快速乘是利用了一个bug才实现的功能。

这个bug 就是 long double 和long long 的定义范围不同。因为long double的范围比long long 大一些。

它来源于下面这篇文章:

什么意思呢?

简单来说,就是就是在原地爆炸的边缘疯狂试探,把本来存进long long会炸掉的值先进行计算,用long double暂时存下,然后再把差值——一个不会超过long long的数字塞回去,再特判一下精度问题,就大功告成了。

int QuickMult(long long a,long long b,long long mod) {
	long long d=(long double)a/mod*b;
	long long ans=(unsigned long long)a*b-(unsigned long long)d*p;
	return (ans+mod)%mod;
}

但是它就是可以算出正确答案来。因为它其实很巧妙的运用了自动溢出这个操作,我们的代码中的z就表示 所以我们要求的就变成了 ,虽然这两个部分都是会溢出的,但(unsigned)保证了它们溢出后的差值基本不变,所以即使它会溢出也不会影响最终结果的!


优点与缺点:

优点就是代码简短高效,缺点就是容易丢失精度。

    扫描二维码推送至手机访问。

    版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

    分享给朋友:
    返回列表

    上一篇:【数论】龟速乘

    下一篇:unsigned

    相关文章

    unsigned

    在一些代码中,经常能看到unsigned这种数据类型,比如下面这样的。#include<iostream> using namespace std; int&nbs...

    如何估算时间复杂度

    首先:  常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n^2)<Ο(n^3)<…<Ο(2^n)<Ο(n!)时间复杂度可以简单理解为最多执...

    【数据结构】栈—括号匹配检验

    【数据结构】栈—括号匹配检验

    【题目描述】假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[  (  [  ] [  ] ) ] 等为正确的匹配,[&nbs...

    【题解】玩具

    【题目描述】商店正在出售蒜头君最喜欢的系列玩具,在接下来的 " 周中,每周会出售其中的一款,同一款玩具不会重复出现。由于是蒜头君最喜欢的系列,他希望尽可能多地购买这些玩具,但是同一款玩具蒜头...

    C++中箭头指针的含义及用法

    C++中箭头指针的含义及用法

    0.前言c++中我们在一些程序中看到箭头 p—>stu 类似于这样的表示。今天就简单来解释一下点运算和箭头运算。1.点运算常见的点一般出现在结构体中,比如下面的代码:#include<io...

    进制转换类问题汇总

    二进制转十进制十进制转二进制十进制转M进制(M一般小于16)M进制转十进制M进制和N进制互转...