• 快速幂模版


    快速幂模版

    快速幂的思想是分治,根据题目的数据要注意long long 

    快速幂普通版,比取余版快,但容易超范围,慎用,一般可用取余版MOD设为INF:

    //快速幂普通版(未取余)
    long long quickpow(long long n,long long k)
    {
        long long res=1;
        while(k){
            if(k&1) res*=n;
            n*=n;
            k=k>>1; //即k/=2,采用位运算更快
        }
        return res;
    }
    快速幂普通版(未取余)

    快速幂取余数版:

    //快速幂取余版
    long long quickpow(long long n,long long k,long long MOD)
    {
        long long res=1;
        while(k){
            if(k&1) res=(res*n)%MOD;
            n=(n*n)%MOD;
            k=k>>1;
        }
        return res;
    }
    快速幂取余版

     由于若题目数据太大,会使快速幂时由于是先乘后取余,乘后会导致越界,故可采用模拟乘法,在模拟乘法过程中取余数

    /* 快速幂取余+模拟乘法 */
    long long multi(long long a,long long b,long long MOD)//模拟乘法,a*b=a+a+a+...+a(b个a相加) 方法用分治,和快速幂相同
    {
        long long res=0;
        while(b){
            if(b&1) res=(res+a)%MOD;
            a=(2*a)%MOD;
            b=b>>1;
        }
        return res;
    }
    
    long long quickpow(long long n,long long k,long long MOD)
    {
        long long res=1;
        while(k){
            if(k&1) res=multi(res,n,MOD);//直接乘会越界,需要模拟在模拟过程中取余数
            n=multi(n,n,MOD);
            k=k>>1; //也就是K/=2,位运算更快
        }
        return res;
    }
    快速幂取余+模拟乘法
    没有AC不了的题,只有不努力的ACMER!
  • 相关阅读:
    Linux systemd & init.d
    windows 气泡提示
    C++17新特性
    Lua & C++
    C++智能指针原理
    C++ Memory Order
    析命令提示符的原理
    设置与获取系统代理信息
    命令查看系统信息
    Linux shell脚本
  • 原文地址:https://www.cnblogs.com/--560/p/4338675.html
Copyright © 2020-2023  润新知