求幂&&快速幂&&位运算

1.普通的求幂方法:

时间复杂度为O(n),对于比较大的数在1s限时内可能会TLE

int pow(int base,int p){
       int ans=1;

       for(int i=1;i<=p;i++)
          ans*=base;

       return ans;
}

2.快速幂:

时间复杂度为logn

(1)结合位运算

原理:指数p可转化为2进制形式

  则basep=basei(1)*2^0+i(2)*2^1+i(3)*2^2+……

      =basei(1)*2^0*basei(2)*2^1*basei(3)*2^2*……

                当i(n)=0时相当于乘了1,也就相当于什么也没乘,而每次待乘的数都是base2^k,乘不乘由系数i(k+1)决定,但不管乘不乘,下一次待乘的数都是base2^(k+1)即base2*2^k也就是(base2^k)2

代码实现:

long long fastpow(long long base,long long p){
        long long ans=1;

        while(p!=0){    
               if(p&1!=0)//如果这一位(二进制最后一位)为1,则乘上待乘的数(或P%2==1)
                      ans*=base;
              
               base*=base;
               p>>=1;(或者p/=2)
         }

         return ans;
}
        
         

(2)结合模运算

我们知道basep%d=(base%d)*(base%d)*(base%d)*……%d

        =(base%d)p%d

上代码:

 long long fastpowmod(long long base,long long p,long long d){
                long long ans=1;
                base%=d;
    
                while(p!=0){
                        if(p&1!=0)
                                ans=ans*base%d;
                        
                        base=base*base%d;
                        p>>=1;
                }
                
                return ans;
}        

猜你喜欢

转载自www.cnblogs.com/WhiteThornZzf/p/12335995.html