zoukankan      html  css  js  c++  java
  • 《算法笔记》二分—快速幂

    问题:给定a(a<109)、b(b<106)、m(1<m<109),计算ab%m,时间复杂度为O(b)

    使用快速幂思想计算

    一、递归写法,时间复杂度O(logb)

    终止条件为:a0=1
    递归公式为:
    若b为奇数,ab=aa(b-1)
    若b为偶数,ab=a(b/2)
    a(b/2)

    #include<algorithm>
    using namespace std;
    
    typedef long long LL;
    
    LL binaryPow(LL a,LL b,LL m)
    {
        if(b==0) return 1;
        if(b^1)//用与运算判断b为奇数,速度快一点
        {
            return a*binaryPow(a,b-1,m)%m;
        }
        else
        {
            LL mul;
            mul=binaryPow(a,b/2,m);
            return mul*mul%m;
        }
    }
    int main()
    {
        
        return 0;
    }
    

    如果a>m,在进入递归前,就应该先让a模m
    如果m为1,就不用进入递归函数

    迭代写法

    将b写为二进制,b为多项二次幂之和,ab可以写为a(2i)...a8a4a2**a,如果当前二进制位为1,a(2i)项就被选中
    每一项都等于后一项的平方

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    
    typedef long long LL;
    LL binaryPow(LL a,LL b,LL m)
    {
        int ans=1;
        while(b>0)
        {
            if(b&1)
            {
                ans=ans*a%m;
            }
            a=a*a%m;
            b>>=1;
        }
        return ans;
    }
    
    作者:inss!w!
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 相关阅读:
    vs2015编译各种库
    回测分析软件
    交易平台
    策略框架
    期货homes平台以及仿ctp接口
    k线中转器
    期货数据服务器以及取数据接口
    c++ 二叉树的遍历(迭代,递归)
    c++实现单向链表的一些操作
    numpy操作
  • 原文地址:https://www.cnblogs.com/Hfolsvh/p/14375237.html
Copyright © 2011-2022 走看看