算法题(160):64位整数除法
审题:
本题需要我们计算出数量级巨大的(a*b)%p的值,其中a,b,p的数据类型都是longlong
思路:
方法一:暴力解法
我们可以直接计算a*b的结果,然后再取余p。但是由于他们的数量级过高,计算时空间可能会溢出,所以本方法无效
方法二:倍增思想
其实a*b可以看成b个a相加(a+a+a....),所以我们可以利用倍增的思想来计算。
图示:
这里要不要加当前的倍增结果就可以通过看b的二进制表示对应位数来确定了
如果对应位数为1说明要加,否则则不需要。
且计算倍增结果和添加到answer的时候都进行取余,可以保证不溢出
解题:
#include<iostream> using namespace std; typedef long long ll; ll answer; ll func(ll a, ll b, ll p) {ll x = a;while (b){if (b & 1) answer = (answer + x)%p;x = (x + x) % p;b = b >> 1;}return answer; } int main() {ll a, b, p;cin >> a >> b >> p;cout << func(a,b,p) << endl;return 0; }
P10446 64位整数乘法 - 洛谷