zoukankan      html  css  js  c++  java
  • 算法 快速幂

    1.整数快速幂

    计算 a^p  

    a ^ p =a ^ ( k * d + c ) = ( a ^ k) ^ d * a ^ c;

    e.g. 2 ^ 5 = ( 2 ^ 2 ) ^ 2 * 2 ^ 1 计算次数减少

    对应p的二进制位,若该二进制位为1, ans乘上该位的res幂次,每二进制位乘上该位幂次 res*=res

    //整数快速幂 计算a^p
    ll qpow(ll a, ll p)
    {
        ll ans=1, res=a;
        while(p)
        {
            if(p&1)
            {
                ans*=res; //p该二进制位为1 乘上幂次
            }
            res*=res; // 二进制位幂次相乘
            p>>=1;
        }
        return ans;
    }

    2.矩阵快速幂

    矩阵a,b相乘要满足条件:a的行数==b的列数

    类似整数快速幂 把整数相乘替换乘矩阵相乘

    //矩阵快速幂
    
    struct Mat
    {
        ll x[N][N];
    };
    Mat c;
    ll n;
    
    Mat multi(Mat a, Mat b)
    {
        Mat tmp;
        mem(tmp.x);
        fo(i,n)
            fo(j,n)
                fo(k,n)
                tmp.x[i][j]+=a.x[i][k]*b.x[k][j];
        return tmp;
    }
    
    Mat m_qpow(Mat a, ll p)
    {
        //整数乘法替换成矩阵乘法
        fo(i,n) c.x[i][i]=1;
        Mat ans=c, res=a;
        while(p)
        {
            if(p&1)
            {
                ans=multi(ans,res);
            }
            res=multi(res,res);
            p>>=1;
        }
        return ans;
    }
  • 相关阅读:
    Exp9 Web安全基础
    EXP8 Web基础
    Exp7 网络欺诈防范
    Exp6 信息搜集与漏洞扫描
    Exp5 MSF基础应用
    Exp4 恶意代码分析
    Exp3 免杀原理与实践
    Exp2 后门原理与实践 20154317
    正则表达Regex替换标签
    正则表达式
  • 原文地址:https://www.cnblogs.com/op-z/p/10778932.html
Copyright © 2011-2022 走看看