zoukankan      html  css  js  c++  java
  • 快速幂模版

    快速幂模版

    快速幂的思想是分治,根据题目的数据要注意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!
  • 相关阅读:
    .NET程序运行原理及基本概念详解
    c# 操作Redis的五种基本类型总结
    手写MQ框架(一)-准备启程
    手写MVC框架(二)-代码实现和使用示例
    手写DAO框架(七)-如何保证连接可用
    spring cloud入门
    maven学习整理
    mybatis入门学习
    spring事务使用探究
    微内核OS学习
  • 原文地址:https://www.cnblogs.com/--560/p/4338675.html
Copyright © 2011-2022 走看看