快速幂取模算法

在算法程序设计竞赛中,会经常碰到对某个数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;
}

 

posted @ 2018-07-20 14:57  浮生惘语  阅读(263)  评论(0编辑  收藏  举报