快速幂 c++

一般大家写x^a都是

int ans = 1;
for (int i = 1; i <= a; i ++)
    ans *= x;

时间复杂度O(n)

但是这对于我们还不够,我们要O(logn)


首先我们得知道一个数学知识

x^{a^{b}} = x^{a*b}

那么求 x^a 就有以下递归式

a 能2整除   x^a = x^{(a/2)^{2}} = x^{a/2} * x^{a/2}

a 不能2整除  x^a = x^{(a/2)^{2}} * x = x^{a/2} * x^{a/2} * x (这里a/2是整除)

所以每次都调用 a/2 不就是O(logn)

最后补充一个东西

x^a mod b = (x^{i} mod b * x^{j} mod b) mod b  (i + j = a)

代码:

#include 
using namespace std;
typedef long long LL;
LL a, b, m;
//m是取模的数
LL q_pow(LL a, LL b, LL m) {
	if(b == 0)
		return 1;
	LL tmp = q_pow(a, b >> 1, m) % m;
	return (b & 1 ? a : 1) * tmp % m * tmp % m;
//b & 1 和 b % 2 == 1 是等价的
}
int main() {
	cin >> a >> b >> m;
	cout << q_pow(a, b, m);
	return 0;
} 

你可能感兴趣的:(c++,算法,数据结构,快速幂,取模)