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

    在算法程序设计竞赛中,会经常碰到对某个数N进行求大数次幂并对1e9+7取模的运算的题目,一方面求大数次幂是一个时间复杂度很高的运算(容易超时),另一方面对1e9+7取模,暗示着结果是连long long都存不下(同余定理),所以这时候快速幂取模算法就派上用场了,我们先来求a^bmodc;

    算法1:直接设计,朴素

    int ans = 1;
    for(int i = 1;i<=b;i++)
    {
       ans = ans * a;
    }
    ans = ans % c;

    缺点:数字过大会溢出,而且比较费时间,

    接下来介绍一下同余定理

    (a +/- b) % c = (a % c +/- b % c) % c 
    
    (a * b) % c = (a % c) * (b % c) % c 
    
    a^b % c = (a % c)^b % c

    算法2:快速幂,根据公式

    int PowerMod(int a, int b, int c)
    {
        int ans = 1;
        a = a % c; //对刚进来的a进行取模运算,避免后面第一次求平方运算溢出
        while(b)
        {
            if(b&1) //相当于b % 2 = = 1对二进制下的 b 进行按位与1运算,求二进制下 b 的最低位是否为1
                ans = ans * a % c; //对结果进行保存
            b>>=1; //相当于b = b/2;二进制下的 b 右移一位,相当于十进制下的 b 除以2
            a = a * a % c; 
        }
        return ans%c;
    }
  • 相关阅读:
    pythone 请求响应字典
    python strip()
    python,datetime
    How Flask Routing Works
    python __file__ 与argv[0]
    Python的zip函数
    Python中的__new__()方法与实例化
    python,dict的setdefault方法
    python yield
    python with用法
  • 原文地址:https://www.cnblogs.com/aerer/p/9931041.html
Copyright © 2011-2022 走看看