zoukankan      html  css  js  c++  java
  • 快速幂 概念及模板

    快速幂

    顾名思义,快速幂就是快速算底数的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 }

    参考: 百度百科

  • 相关阅读:
    redhat 7.2 内网安装docker
    使用dockerfile 创建ubuntu ssh镜像
    docker 离线环境安装oracle
    redhat 6.6 、7、Centos7离线安装docker
    用命令行管理aws s3
    Anaconda介绍、安装及使用教程
    python2 编码问题万能钥匙
    从mongo数据库中导出数据的方法
    MongoDB学习第三篇 --- Insert操作
    MongoDB学习笔记(一)-Insert操作
  • 原文地址:https://www.cnblogs.com/stranger-/p/7275761.html
Copyright © 2011-2022 走看看