快速幂运算

本文介绍了一种高效计算A^BModC的方法——快速幂取模算法,通过将指数转换为二进制形式并利用位运算,将时间复杂度从O(n)降低至O(logn)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
* 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注
给出3个正整数A B C,求A^B Mod C。
例如,3 5 8,3^5 Mod 8 = 3。
Input
3个正整数A B C,中间用空格分隔。(1 <= A,B,C <= 10^9)
Output
输出计算结果
Input示例
3 5 8
Output示例
3
* */


import java.util.Scanner;

public class Main {

    public static long powMod(long a,long b,long c){
        long res = 1;
        while(b>0){
            if((b&1)==1){
                res = ((res%c)*(a%c))%c;
            }
            b >>= 1;
            a = ((a%c)*(a%c))%c;
        }
        return res;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        long a = in.nextLong();
        long b = in.nextLong();
        long c = in.nextLong();
        long res = powMod(a,b,c);
        System.out.println(res);
    }

}

求a^n,先不考虑是否会超出数据表示的精度范围,如果是用for(1:n)循环的话,时间复杂度为O(n),若n值为10^9,往往在oj中就会超时。然而,n是可以用二进制表示的,n = 2^k1 + 2^k2 + 2^k3 + …+ 2^kn (共有log n项), 令pi = 2 ^ ki,则n=p1+p2+…+pn,哪么a ^ n = a^p1 * a^p2 * a^p3*….*a^pn,哪么原先n项相乘就变为了log n项相乘,时间复杂度从O(n)转变为O(log n) 。

现在要求A^156,而156(10)=10011100(2)
也就有A^156=>(A^4)(A^8)(A^16)*(A^128) 考虑到因子间的联系,我们从二进制10011100中的最右端开始计算到最左端。细节就说到这,下面给核心代码:
res = 1;
while(N)
{
if(N&1)
res=res*A;
N>>=1;
A=A*A;//A是在变化的,每一位都是前一位乘以”A“
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值