求pow(int a, int b, int c) a^b%c
1.递归写法:(时间复杂度为ln(b))
如果b是奇数,则a^b = ( a ^ (b / 2) ) ^ 2 * a
如果b是偶数,则a^b = ( a^(b / 2) ) ^ 2
且根据定理( (a*b) % c == (a % c) * (b % c))% c )有下面的代码:
int pow_mod(int a, int b, int mod) {
if(b == 0) {
return 1 % mod;
}
int temp = pow_mod(a, b / 2, mod);
temp = ((temp % mod) * (temp % mod)) % mod;
if(b & 1) {
temp = ((temp % mod)* (a % mod)) % mod;
}
return temp;
}
2. 循环写法:(时间复杂度为ln(b) )
分解b的二进制,如2的11次可以分解为 : 2^8 * 2^2 * 2^1.(因为11的二进制为1011),所以需要乘上2^8,2^2,2^1,而2^4不需要乘。
long long quick_mod(int a, int b, int c) {
long long ans = 1;
long long base = a;
while(b) {
if(b & 1) ans = ( (ans %c) * (base % c) )% c;
base = ((base % c) * (base % c) ) % c;
b >= 1;
}
return ans;
}