快速幂(Java)

快速幂

相关例题:

求 a 的 b 次方对 p 取模的值。

0≤a,b,p≤1e9
数据保证 p≠0

常规解决方法(暴力解法)

C语言的学习让我们深深的爱上了for循环的使用,在我看到这题的时候,不加思索,循环用b控制循环的次数,得出结果之后再取模。解决!但是当我们想当然的把自己的代码提交之后,就会发现“时间超限!”那么有没有什么可以解决时间超限的问题,也就是可以让循环的次数尽可能少。这就引出了今天要介绍的内容:快速幂

快速幂的理解

以36为例子,我们发现36=33*33,33又可以化为31*3^1,当然最后的结果要在乘以3,不难发现,如果我们可以不断地把指数进行拆分,这样就简化了运算的步骤,从而实现了缩短时间的目的。

指数为奇数和指数为偶数的不同情况

当指数为偶数的时候较为简单,每一次都将指数拆分(也就是把指数/2),当指数为奇数,或者拆分后指数为奇数时,再将结果乘以底数即可。
在这里插入图片描述
如图所示,以3^100的拆分为例子。

快速幂的解法(递归版)

经过上面的图片我们不难发现,经过拆分,最后都可以变为底数^1,因此,我们可以设计一个递归函数,当指数为1的时候,返回值为本身,如果大于1,就返回拆分后的结果。这样一来就实现了快速幂算法的实现。

取模运算

当然我们掌握了快速幂的求解之后,还要掌握的就是取模运算
a ^ b % p = ((a % p)^b) % p

代码部分

有了以上的知识基础知识,我们就可以进行代码部分的编写在这离我们运用Java语法进行编写

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
long a,b,p;
a=in.nextLong();
b=in.nextLong();
p=in.nextLong();
long ans=f(a,b,p);
ans=ans%p;
System.out.println(ans);
}
private static long f(long m,long n,long t) {//
if(n==0)
return 1;
long c=f(m,n/2,t)%t;
if(f1(n)==1)
return cc%tm%t;
return c*c%t;
}
private static long f1(long n) {
if(n%2=0)
return 0;
else
return 1;
}
}

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值