c++ 快速乘

First

在一些数学题中,两个数相乘运算很多,同时又很容易溢出,如两个 long long 相乘
今天本蒟蒻来总结一下快速乘的两种方法

1:二进制

和快速幂的原理一样,优化一个一个加的算法,复杂度\(O(\log n)\)
适用于一般场合,慢但是稳定

typedef long long LL;
inline LL Mul(LL x,LL y,LL p){
	register LL res=0;
	for(;y;y>>=1,x=(x+x)%p)
	if(y&1)res=(res+x)%p;
	return res;
}

2:运用 Long Double

原理:\(a\times b\mod p=a\times b-\lfloor\dfrac{a\times b}{p}\rfloor\times p\)
就是利用long double处理\(\lfloor\dfrac{a\times b}{p}\rfloor\),复杂度\(O(1)\)
适用于需要卡常数的题目,但是long double有精度问题,若数据太大容易出锅

typedef long long LL;
typedef long double LD;
inline LL Mul(LL x,LL y,LL p) {
    return (x*y-(LL)((LD)x/p*y)*p+p)%p;
}
posted @ 2021-01-19 10:57  小蒟蒻laf  阅读(307)  评论(0编辑  收藏  举报