求 a 乘 b 对 p 取模的值。
输入格式
第一行输入整数a,第二行输入整数b,第三行输入整数p。
输出格式
输出一个整数,表示a*b mod p的值。
数据范围
1≤a,b,p≤1018
输入样例:
3
4
5
输出样例:
2
思路:快速幂模板。将b写成二次幂的模板。当第i位上的值是1时。ab的值就加上a(2^i)。i从0开始。
本题记得每次计算后取模。
例如:a=3,b=7。ab=21.
利用快速幂模板写法。b为111。i从右往左
当i=0时。3(2^0)=3;然后b右移一位变成11
当i=1时。3(2^1)=6;然后b右移一位变成1
当i=2时。3(2^2)=12;然后b右移一位变成0.退出
#include<iostream>
using namespace std;
int main(){
long long a,b,c;
cin>>a>>b>>c;
long long ans=0;
//当b不为0时循环
while(b){
//当b的二进制的最后一位上是1时为true
if(b&1){
ans=(ans+a)%c;
}
//b右移一位。比如111右移变成11
b>>=1;
//下一次是a*(2^i),i从1~无穷
a=(2*a)%c;
}
cout<<ans<<endl;
return 0;
}