题目
求 a 乘 b 对 p 取模的值。
输入格式
第一行输入整数a,第二行输入整数b,第三行输入整数p。
输出格式
输出一个整数,表示a*b mod p
的值。
数据范围
1 ≤ a , b , p ≤ 10e18
输入样例
3
4
5
输出样例
2
思路
当数字比较小的时候,我们可以直接求解(a*b)%p,但是当a,b足够大的时候,就会爆long long,这时候可以使用龟速乘来进行求解。
例如:(2*9)%3使用龟速乘的步骤如图
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int q_add(int a,int b,int p)
{
int ans = 0;// 初始状态下ans = 0
while(b)
{
if(b & 1) ans = (ans + a) % p;// 若a的个数是奇数,就拿出来一个加到ans上,剩下的两两合并
a = (a + a) % 2;// 将a两两合并
b >>= 1;// 两两合并之后,a的个数位原来的二分之一
}
return ans;
}
int32_t main()
{
int a,b,p;
cin >> a >> b>> p;// 输入a,b,p
int ans = q_add(a,b,p);
cout << ans << endl;
}