位运算解决64位整数乘法
假设a和b都是64位整数,要计算a*b同样可以利用位运算,首先还是考虑把b通过二进制的思想分解成几个数的和,
b
=
n
1
+
n
2
+
.
.
.
+
n
k
b=n_{1}+n_{2}+...+n_{k}
b=n1+n2+...+nk,要注意这k个数之间的关系,那么
a
∗
b
a*b
a∗b就可以写成
a
∗
n
1
+
a
∗
n
2
+
.
.
.
+
a
∗
n
k
a*n_{1}+a*n_{2}+...+a*n_{k}
a∗n1+a∗n2+...+a∗nk.所以还是每次判断b的最低位,看是否为1,比如第i位为1,就加
2
i
2^{i}
2i个a,怎么得到这
2
i
2^{i}
2i个a呢,其实只要在每次的循环中让a加上它本身即可。下面来看一道题。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
long long a, b, p;
cin >> a >> b >> p;
long long rel = 0;
while(b)
{
if(b & 1) rel = (rel + a) % p;
a = (a + a) % p;
b >>= 1;
}
cout << rel << endl;
return 0;
}