快速幂取模算法

35 篇文章 3 订阅
34 篇文章 0 订阅

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值