原理:
假设要求x^n,如果n = 2^k,那么原题可以很轻松的表示为:x^n = ((x^2)^2)^2…。这样只要做k次平方
运算就能解决,时间复杂度就从O(n)下降到log(n)。
普通版:
typedef long long ll;
ll mod_pow(ll x, ll n, ll mod){
ll res = 1;
while( n > 0 ){
if( n & 1 ) res = res * x % mod; //n&1其实在这里和 n%2表达的是一个意思
x = x * x % mod;
n >>= 1; //n >>= 1这个和 n/=2表达的是一个意思
}
return res;
}
递归版:
typedef long long ll;
ll mod_pow(ll x, ll n, ll mod){
if( n == 0 ) return 1;
ll res = mod_pow( x * x % mod, n / 2, mod );
if( n & 1 ) res = res * x % mod;
return res;
}