原题传送门
思路:这题有两种做法:递归和迭代。我这里用的是迭代求法,先定义长整型变量并赋值,接下来判断指数的二进制末尾是否为1,若1则为奇数,累积上a,然后令底数b求平方,再将指数p的二进制向右移1位,一直重复这个过程直到p<=0结束
代码参考
#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
ll b,p,k,ans;
cin>>b>>p>>k;
ans=1;
cout<<b<<"^"<<p<<" mod "<<k<<"=";
while(p > 0){
if(p & 1)//b的二进制末尾为1,即奇数
ans = ans * b % k;
b = b * b % k;
p >>= 1;//将b的二进制向右移1位数
}
cout<<ans%k;
return 0;
}