class Solution {
public:
/*
* @param a, b, n: 32bit integers
* @return: An integer
*/
//要用long long类型,不然可能溢出
long long fastPower(long long a, long long b, long long n) {
// write your code here
if ( n == 0 )
return 1 % b;
long long mm = a;
long long c = 0;
long long alone = 1;
while ( mm != 1 ){//当
long long tmp = mm;
getMinMax(mm, b, n, mm, c);
if ( mm < b )
return ((alone%b)*(mm%b))%b;
//乘积之间取余数,不然乘积可能溢出
alone = ( ((alone%b)* (getPower(tmp, n % c))%b) % b );//获取没有分配的乘数的幂次后取余数的结果
mm = ( mm%b );//这是求出最小大数后取余数后的结果
n = n / c;//这是处理完的幂次数
if (isBiger(mm,n,b)==false)
return ((alone%b)*getPower(mm, n) % b)%b;
}
return alone;
}
//要用isBigger判断,不能直接求出幂次,因为会溢出
bool isBiger(long long mm, long long n, long long b){
long long tmp = 1;
for ( int i = 0; i < n; i++ ){
tmp = tmp*mm;
if ( tmp>b )return true;
}
return false;
}
long long getPower(long long n, long long c){
long long tmp = 1;
for ( int i = 0; i < c; i++ ){
tmp = tmp*n;
}
return tmp;
}
void getMinMax(long long a, long long b, long long n, long long & mm, long long& c){
long long tmp = 1;
long count = 0;
while ( tmp<b&&count<n ){
tmp = tmp*a;
count++;
}
mm = tmp;
c = count;
}
};