• 快速幂 概念及模板


    快速幂

    顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。

    原理

    以下以求  a的b次方 来介绍

    把b转换成二进制数。该二进制数第i位的权为
    例如b=11:
    11的二进制是1011
    11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
    因此,我们将a¹¹转化为算
                                    
     
    实现
    快速幂可以用位运算来实现
    and    1  {也就是取b的二进制最低位(即第0位) 判断b是否为奇数,是则为1}
    shr 1  {就是去掉b的二进制最低位(即第0位)}
     
    c++实现
     
    b & 1   //取b二进制的最低位,判断和1是否相同,相同返回1,否则返回0,可用于判断奇偶
    b >> 1  //把b的二进制右移一位,即去掉其二进制位的最低位
     
     
    快速幂加取模模板
     
    ll pow(ll n,ll m)
    {
        ll ans = 1;
        while(m > 0)
        {
            if(m & 1)ans = (ans * n) % mod;
            m = m >> 1;
            n = (n * n) % mod;
        }
        return ans;
    }
    代码比较

    常规求幂

    1 int pow1(int a,int b){
    2    int r=1;
    3    while(b--) r*=a;
    4    return r;
    5 } 

    快速求幂(一般)

    1 int pow2(int a,int b){
    2     int r=1,base=a;
    3     while(b!=0){
    4     if(b%2) r*=base;
    5     base*=base;
    6     b/=2;
    7     }
    8     return r;
    9 }

     

    快速求幂(位运算)

     1 int pow3(int x,int n){
     2   if(n==0) return 1;
     3   else {
     4     while((n&1)==0){
     5       n>>=1;
     6       x*=x;
     7     }
     8   }
     9   int result=x;
    10   n>>=1;
    11   while(n!=0){
    12     x*=x;
    13     if(n&1) result*=x;
    14     n>>=1;
    15   }
    16   return result;
    17 }

     

    快速求幂(位运算,更简洁)

    1 int pow4(int a,int b){
    2   int r=1,base=a;
    3   while(b){
    4     if(b&1) r*=base;
    5     base*=base;
    6     b>>=1;
    7   }
    8   return r;
    9 }

    参考: 百度百科

  • 相关阅读:
    如何确保消息不丢失?
    消息基于什么传输?
    如何确保消息正确地发送至 RabbitMQ?如何确保消息接收方消费了消息?
    消息怎么路由?
    消息如何分发?
    mq 的缺点?
    RabbitMQ 的集群?
    使用 RabbitMQ 有什么好处?
    如何避免消息重复投递或重复消费?
    什么是 rabbitmq?
  • 原文地址:https://www.cnblogs.com/stranger-/p/7275761.html
Copyright © 2020-2023  润新知