Problem description:
Given two integers m and n, find the integer represented by the last three digits of
m
n
m^n
mn.
For example, if
m
=
3
m=3
m=3 and
n
=
9
n=9
n=9, the returned number should be
683
(
3
9
=
19683
)
683(3^9=19683)
683(39=19683).
Please give an algorithm with
O
(
l
o
g
n
)
O(logn)
O(logn) complexity.
Note:
In a computer program, when
m
m
m or
n
n
n is large, exponential calculations may cause data overflow. Your algorithm should be able to avoid this problem.
Input:
Line 1: two integers
m
m
m
n
n
n, split by space
Output:
Line 1: one integer
Sample Input 1:
3 9
Sample Output 1:
683
Sample Input 2:
2 10
Sample Output 2:
24
Solution:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std
;
int power(int m
,int n
)
{
int lastthree
;
if (n
==0)
return 1;
else if(n
==1)
return m
%1000;
else if(n
%2==1){
lastthree
= (m
%1000)*power(m
,(n
-1)/2)*power(m
,(n
-1)/2);
return lastthree
%1000;
}
else if(n
%2==0){
lastthree
= power(m
,n
/2)*power(m
,n
/2);
return lastthree
%1000;
}
}
int main()
{
int m
, n
;
scanf("%d%d",&m
,&n
);
cout
<< abs(power(m
, n
)) << endl
;
return 0;
}
注意:
要求输出
m
n
m^n
mn的后三位,每次只需要计算
m
m
m的后三位即可,因此使用
%
1000
\%1000
%1000求每次运算的后三位数。采用“分治”(divide and conquer)思想,采用递归,来满足
O
(
l
o
g
n
)
O(logn)
O(logn)的时间复杂度。输出注意取绝对值。注意
n
=
0
n=0
n=0的情况。