算法竞赛进阶指南-2.64位整数乘法
题目链接
Method : 位运算-二进制拆分
基础位运算,类似于快速幂,用了倍增的思想:
;
;
;
;
…对于任意一个b,都可以把b拆成一个2进制数表达
如:
注意两点:
- 有取模运算时不要用自加
+=
, 否则会影响计算顺序 - return 时也要取模, 防止极端例子:
b = 0
且p = 1
#include <iostream>
#include <algorithm>
using namespace std;
typedef unsigned long long LL;
LL a, b, p;
LL int64_mul(LL a, LL b) {
LL res = 0LL;
while (b) {
if (b & 1) {
res = (res + a) % p;
}
a = (a + a) % p;
b = b >> 1;
}
return res % p;
}
int main() {
cin >> a >> b >> p;
cout << int64_mul(a, b) << endl;
return 0;
}
复杂度分析
时间复杂度, 其中为对进行二进制拆分的时间复杂度。
空间复杂度。
本博客所有文章均采用 CC BY-NC-SA 4.0 协议 ,禁止商用,转载请注明出处!