题目地址:
https://www.acwing.com/problem/content/description/92/
求 a a a乘 b b b对 p p p取模的值。
输入格式:
第一行输入整数
a
a
a,第二行输入整数
b
b
b,第三行输入整数
p
p
p。
输出格式:
输出一个整数,表示
a
∗
b
m
o
d
p
a*b \mod p
a∗bmodp的值。
数据范围:
1
≤
a
,
b
,
p
≤
1
0
18
1≤a,b,p≤10^{18}
1≤a,b,p≤1018
可以用类似快速幂的做法来做快速加(即算 b b b个 a a a相加,这里是把乘法换成加法来做了,也叫做“龟速乘”,因为乘法会造成溢出)。代码如下:
#include <iostream>
#include <cstring>
using namespace std;
long qadd(long a, long b, long p) {
long res = 0;
while (b) {
if (b & 1) res = (res + a) % p;
b >>= 1;
a = (a + a) % p;
}
return res;
}
int main() {
long a, b, p;
scanf("%ld%ld%ld", &a, &b, &p);
printf("%ld\n", qadd(a, b, p));
return 0;
}
时间复杂度 O ( log b ) O(\log b) O(logb),空间 O ( 1 ) O(1) O(1)。