【慢速加实现64位乘法】AcWing90 64位整数乘法
题意
求\(a*b\%q(1 \leq a,b,q \leq 10^{18})\)的值。
题解
在计算机中,数字都是以二进制数表示的。例如:\(5_{10}\)的二进制数为\(101_2\)。
对于\(2\)的幂级数,都可以表示为:\(1<<n\)。
那么\(5_{10}\)就可以用多个\(2\)的幂级数表示为:
\[101_2=(1<<0)+(1<<2)
\]
\(\because\)乘法满足分配律
\(\therefore a * b\)可以表示为:
\[a*b=a*(b关于2的幂级数和)
\]
由于a和b的数据范围都会达到\(10^{18}\),若直接使用乘法操作,则会爆\(long long\),所以当两个数不能直接相乘时就考虑使用加法来实现乘法。
一个不大于\(10_{18}\)的数乘以\(2\)是不会爆\(long long\)的
因此使用加法来实现乘法是可以实现题目要求的值的。
参考代码
C++
ll qadd(ll a, ll b, ll p) {
Ll ans = 0;
while (b) {
if (b & 1) {
ans = (ans + a) % p;
}
a <<= 1;
a %= p;
b >>= 1;
}
return ans;
}
浙公网安备 33010602011771号