题目 2088: [蓝桥杯][算法提高VIP]快速幂

本文介绍了一种解决大数指数运算的方法,并通过具体实例展示了如何利用快速幂算法求解(A^B)modP的问题。重点讲解了算法的实现过程及注意事项。

时间限制: 1Sec 内存限制: 128MB

题目描述:(原题链接)

给定A, B, P,求(A^B) mod P。


输入:

输入共一行。
第一行有三个数,N, M, P。

样例输入:

2 5 3


输出:

输出共一行,表示所求。
共10组数据
对100%的数据,A, B为long long范围内的非负整数,P为int内的非负整数。

样例输出 :

2


解题思路:

     大数处理 及 快速幂

注意事项:

     输入的n,m为大数时,会编译错误!!所以需要进行数据精度的处理

参考代码:

import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    /*
     * a^b mod c = (a mod c)^b mod c
     * a^b mod c = (a^2)^(b/2) mod c , b为偶数
       a^b mod c = ((a^2)(b/2)·a) mod c , b为奇数
     */
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        BigInteger n=in.nextBigInteger(),m=in.nextBigInteger(),p=in.nextBigInteger();
        BigInteger res=BigInteger.ONE;n=n.mod(p);  //缩小底数的规模
        for(BigInteger i=m;i.compareTo(BigInteger.ZERO)!=0;i=i.divide(BigInteger.valueOf(2))) {     //两个两个的取数求余,减小规模
            if(i.mod(BigInteger.valueOf(2)).compareTo(BigInteger.ONE)==0)        //若指数为奇数,先乘一个底数,使得后面的指数变为偶数个数
                res = (res.multiply(n)).mod(p);
            n =(n.multiply(n)).mod(p);      
        }
        System.out.println(res);
        in.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值