题目描述:
求 a 乘 b 对 p 取模的值,其中 1 <= a,b,p <= 10^18
输入描述:
三个用空格隔开的整数a,b和p。
输出描述:
一个整数,表示a ^ b mod p的值。
实例:
输入: 2 3 9
输出: 6
思路
快速幂
26的二进制为11010
11010&1 = 0 a res=1 11010>>1 --> 1101
1101&1 = 1 a^2 res*=a^2 1101>>1 --> 110
110&1 = 0 a^4 110>>1 --> 11
11&1 = 1 a^8 res*=a^8 11>>1 --> 1
1&1 = 1 a^16 res*=a^16 1>>1 -->0
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
ll a,b,p,res=1;
cin>>a>>b>>p;
while(b){
if(b&1){
res=res*a%p;//如果为1则要算,为0则不算
}
b>>=1;//往右移动1位直到不能移动
a=a*a%p;//a要翻倍
}
printf("%lld\n",res%p);//记得最后结果还要模p
return 0;
}