ACwing89 a^b

题目链接: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;
}
原文地址:https://www.cnblogs.com/hnkjdx-ssf/p/14058342.html