140. fast power

explanation

(a+b) % p = (a%p + b%p) % p
(a-b) % p = (a%p - b%p) % p
(ab) % p = (a%p b%p) % p
(a^b) %p = ((a%p) ^ b) %p

if n is even,
a^n % b = (a^n/2 a^n/2) % b = ((a^n/2 % b) (a^n/2 % b)) % b

if n is odd,
a^n % b = (a^n/2 a^n/2 a) % b = ((a^n/2 % b) (a^n/2 % b) (a % b)) % b

注意Integer overflow的问题

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class  {

* @param a: A 32bit integer
* @param b: A 32bit integer
* @param n: A 32bit integer
* @return: An integer
*/
public int fastPower(int a, int b, int n) {
// write your code here
/*
(a+b) % p = (a%p + b%p) % p
(a-b) % p = (a%p - b%p) % p
(a*b) % p = (a%p * b%p) % p
(a^b) %p = ((a%p) ^ b) %p
*/
if (n < 0) {
n = -n;
a = 1 / a;
}
if (n == 1) {
return a % b;
}

if (n == 0) { // 一定要考虑n=0
return 1 % b;
}
long temp = fastPower(a, b, n/2); //!!!这里一定是long;
temp = (temp * temp) % b; //一定先这一步,否则溢出;
if (n % 2 == 1) {
return (int) ((temp * (a % b)) % b);
} else {
return (int) temp;
}



}
}