还没学会快速幂吗?快来看看

目录

题目

W1:暴力求解

W2:数学思考

W3:快速幂

(3)推荐


题目

题目:求A^B的最后三位数表示的整数(1<=A,B<=10000)

Sample Input

2  3

12 6

Sample Output

8

984

(1<=A,B<=100000000)

W1:暴力求解

即求出A^B的值后再求模,但是注意到A,B的取值范围,显然,不管从空间还是时间来说,都不可以。由此,我们想用其他方法求解。

W2:数学思考

首先,我们可以对每一次运算结果取模,使得空间上有操作性,虽然时间上,B较大时还是无法做到AC,但是已经得到优化了;

那么,就要对A^B运算进行优化;我们引入快速幂;

int Mypow(int A,int B){
  int ans=1;
  for(int i=0;i<B;i++){
    ans = ans*A%1000;
  }
   return ans;
}

W3:快速幂

基本思想:

a^b <=> (a*a)^(b/2)

当然,当指数为奇数或偶数时,我们要讨论:奇数时要多乘a,因为运算符 ' / '向下取整;

此外,我们在使用快速幂时,还有两种方法,这里都列出,供读者学习:

分别为递归和非递归两种;

(1)递归:

int Mypow2(int A,int B){
  int ans;
  if( B == 0 ) ans = 1;
  else
  {  if(n&1)ans*=a;                  //(1)
     ans = Mypow(a*a,n/2)            //(2)
  }
   return ans;
}

a,此处判读奇偶;

b.此处调用递归;

(2)非递归

int Mypow2( int A, int B)
{
 int ans =1;
 while(B){
  if(B&1)ans*=A;
  A=A*A;
  B/=2;
 }
  return ans;
}

以上只给出了快速幂的做法,具体使用对应本题要取模处理;

(3)推荐

372. 超级次方

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值