题目链接:a^b
解题思路
根据数学常识,每一个正整数可以唯一表示为若干指数不重复的2的次幂的和。也就是说,如果b在二进制表示下有k位,其中第i(0<=i<k)位的数字为ci,那么:
因为k=log2(b+1)的向上取整,所以上式乘机项的数量不多于log2(b+1)的向上取整个。又因为:
pow(a,pow(2,i)) = pow(2,pow(a,pow(2,i-1)))
所以我们很容易通过k次递推求出每一个乘积项,当cj=1时,把改乘积项累积到答案中。b&1运算可以取出b在二进制表示下的最低位,而b>>1运算完全可以舍去最低位,在递推的过程中将二者结合就可以遍历b在二进制下的所有位数ci。
样例代码:
#include<bits/stdc++.h>
using namespace std;
int power(int a,int b,int p)
{
int ans=1%p;
for(;b;b>>=1){
if(b&1)
ans=(long long)ans*a%p;
a=(long long)a*a%p;
}
return ans;
}
int main()
{
int a,b,p;
cin>>a>>b>>p;
cout<<power(a,b,p);
return 0;
}