快速乘

快速乘

简介

在一些数论题目中,如果使用普通乘法的话,常常会有爆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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值