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 许可协议。转载请注明出处!
  • 相关阅读:
    补充下前期的信息收集
    上传到github
    burp添加插件
    github加速
    bestphp's revenge[详解]
    [网鼎杯 2018]Comment
    UNCTF2020
    CTFshow web入门 (php特性)
    CTFshow web入门 (文件包含)
    CTFshow web入门 (爆破)
  • 原文地址:https://www.cnblogs.com/Hfolsvh/p/14375237.html
Copyright © 2011-2022 走看看