• 快速幂取模算法


    在算法程序设计竞赛中,会经常碰到对某个数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;
    }
  • 相关阅读:
    第七周进度总结
    第六周进度总结
    第五周进度总结
    《大道至简》读后感
    第四周进度总结
    第三周进度总结
    第二周进度总结
    第一周进度总结
    top工具
    系统监控的一些工具w , vmstat
  • 原文地址:https://www.cnblogs.com/aerer/p/9931041.html
Copyright © 2020-2023  润新知