zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    动态与静态Include
    java回收算法
    reflection是如何工作的。
    hashcode和equals的约定关系如下
    Java调试器
    混合赋值运算符的使用
    Spring
    Math.?
    oracle--触发器(转)
    oracle --游标详解(转)
  • 原文地址:https://www.cnblogs.com/hnkjdx-ssf/p/14058342.html
Copyright © 2011-2022 走看看