题目: https://www.acwing.com/problem/content/92/
- 64位整数乘法
题目
提交记录
讨论
题解
视频讲解
求 a 乘 b 对 p 取模的值。
输入格式
第一行输入整数a,第二行输入整数b,第三行输入整数p。
输出格式
输出一个整数,表示a*b mod p的值。
数据范围
1≤a,b,p≤1018
输入样例:
3
4
5
输出样例:
2
解题思路:
首先如果我们直接暴力的话,2个64位相乘极限的情况会得到一个128位的数,这就会超范围;所以我们需要换一种思路来想。
a * b = a + a + a + … +a + a(有b个a)
那么基于倍增的思想我们可以将b一个2进制数,然后每次判断b的最低的一位是否为1,若是则让res + a ,并对p取余,由于b是被分成的2进制数,所以每次我们都需要让a * 2。
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
int main(void) {
LL a, b, p, res = 0;
scanf("%lld%lld%lld", &a, &b, &p);
while(b) {
if(b & 1) res = (res + a) % p;
a = (a + a) % p;
b >>= 1;
}
printf("%lld\n", res);
return 0;
}