题目传送门
思路:
我们可以使用分治法来计算 (a \times b \mod p)。具体来说,我们可以将 (b) 分解成两部分,分别计算 (a \times (b // 2)) 和 (a \times (b - b // 2)),然后将结果相加并取模。这样可以避免直接计算大数的乘积。
代码&解释:
c++代码:
#include <iostream>
using namespace std;
long long mod_mul(long long a, long long b, long long p) {
if (b == 0) return 0;
if (b == 1) return a % p;
long long half = mod_mul(a, b / 2, p);
if (b % 2 == 0) {
return (half + half) % p;
} else {
return (half + half + a) % p;
}
}
int main() {
long long a, b, p;
cin >> a >> b >> p;
long long result = mod_mul(a, b, p);
cout << result << endl;
return 0;
}
如果看官觉得太复杂,用下面的:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long a,b,p;
cin>>a>>b>>p;
long long ans = 0;
for(;b;b >>= 1){
if(b & 1) ans = (ans + a) % p;
a = (a << 1) % p;
}
cout<<ans<<endl;
return 0;
}
代码解释:
-
函数
mod_mul(long long a, long long b, long long p)
:- 如果 (b) 为 0,返回 0,因为任何数乘以 0 都是 0。
- 如果 (b) 为 1,返回 (a \mod p),因为任何数乘以 1 都是它本身。
- 使用递归计算 (a \times (b / 2) \mod p)。
- 如果 (b) 是偶数,结果是两个 (a \times (b / 2) \mod p) 相加并取模。
- 如果 (b) 是奇数,结果是两个 (a \times (b / 2) \mod p) 相加再加上 (a) 并取模。
-
主函数
main()
:- 使用
cin
读取 (a)、(b) 和 (p) 的值。 - 调用
mod_mul(a, b, p)
计算结果。 - 使用
cout
输出结果。
- 使用
详细解释:
-
递归分治法:
- 通过递归将 (b) 分解成更小的部分,避免直接计算大数的乘积。
- 每次递归将 (b) 除以 2,计算 (a \times (b / 2) \mod p),然后将结果相加并取模。
- 这种方法确保了每次计算的中间结果都不会超过 (p),避免了溢出问题。
-
取模运算:
- 在每次加法操作后都进行取模运算,确保结果始终在 (0) 到 (p-1) 之间。
- 这样可以避免中间结果过大导致的溢出问题。
-
输入输出:
- 使用
cin
从标准输入读取 (a)、(b) 和 (p) 的值。 - 使用
cout
将计算结果输出到标准输出。
- 使用
pascal代码:
program ModMul;
function mod_mul(a, b, p: int64): int64;
var
half: int64;
begin
if b = 0 then
mod_mul := 0
else if b = 1 then
mod_mul := a mod p
else
begin
half := mod_mul(a, b div 2, p);
if b mod 2 = 0 then
mod_mul := (half + half) mod p
else
mod_mul := (half + half + a) mod p;
end;
end;
var
a, b, p, result: int64;
begin
readln(a);
readln(b);
readln(p);
result := mod_mul(a, b, p);
writeln(result);
end.
代码解释:
-
函数
mod_mul(a, b, p: int64): int64
:- 在函数内部声明变量
half
,类型为int64
。 - 如果 (b) 为 0,返回 0。
- 如果 (b) 为 1,返回 (a \mod p)。
- 使用递归计算 (a \times (b div 2) \mod p)。
- 如果 (b) 是偶数,结果是两个
half
相加并取模。 - 如果 (b) 是奇数,结果是两个
half
相加再加上 (a) 并取模。
- 在函数内部声明变量
-
主程序:
- 使用
readln
函数读取 (a)、(b) 和 (p) 的值。 - 调用
mod_mul(a, b, p)
计算结果。 - 使用
writeln
输出结果。
- 使用
python代码:
def mod_mul(a, b, p):
if b == 0:
return 0
if b == 1:
return a % p
half = mod_mul(a, b // 2, p)
if b % 2 == 0:
return (half + half) % p
else:
return (half + half + a) % p
# 读取输入
a = int(input())
b = int(input())
p = int(input())
# 计算并输出结果
result = mod_mul(a, b, p)
print(result)
代码解释:
-
函数
mod_mul(a, b, p)
:- 如果 (b) 为 0,返回 0,因为任何数乘以 0 都是 0。
- 如果 (b) 为 1,返回 (a \mod p),因为任何数乘以 1 都是它本身。
- 使用递归计算 (a \times (b // 2) \mod p)。
- 如果 (b) 是偶数,结果是两个 (a \times (b // 2) \mod p) 相加并取模。
- 如果 (b) 是奇数,结果是两个 (a \times (b // 2) \mod p) 相加再加上 (a) 并取模。
-
读取输入:
- 使用
input()
函数读取 (a)、(b) 和 (p) 的值。
- 使用
-
计算并输出结果:
- 调用
mod_mul(a, b, p)
计算结果并输出。
- 调用