快速乘
简介
在一些数论题目中,如果使用普通乘法的话,常常会有爆long long的情况,于是快速乘(龟速乘 )应运而生。
O ( l o g ) O(log) O(log)的快速乘
乘法其实就是多个加法运算合到一起,考虑将乘法拆开,但一个一个运算显然会超时,于是我们仿照快速幂的做法,二进制拆开
#define int long long
int qmul(int a,int b,int mod){
int ans=0;
while(b){
if(b&1) ans=(ans+a)%mod;
a=(a+a)%mod;
b>>=1;
}return ans;
}
O ( 1 ) O(1) O(1)的快速乘
其实就是运用到了 u n s i g n e d l o n g l o n g unsigned long long unsignedlonglong的自然溢出,同时用 l o n g d o u b l e long double longdouble来优化取模运算
#define ll long long
#define ull unsigned long long
#define ld long double
ll qmul(ll x,ll y,ll mod){
ll z=(ld)x/mod*y;
ll res=(ull)x*y-(ull)z*mod;
return (res+mod)%mod;
}