目录
题目
题目:求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;
}
以上只给出了快速幂的做法,具体使用对应本题要取模处理;