#算法 快速幂

递推的应用——快速幂

让你计算 6986^98 你会怎么算?
是不是这样:

long long ans = 1;
for(int i = 0; i < 98; i++){
    ans *= 6;
}

好家伙,用了九十八次乘法。


但如果把 6986^98 看成是 6496^49 的平方,再把 6496^49 看作是 6256^25 的平方除以6……这样不就可以大大减少算法的复杂度了吗?

显然,使用递归的算法是最简单的实现方式。

当次数为1,返回底数xx
当次数为偶数,调用并返回一个底数不变,次数kk除以二的幂xk2(x^{\frac{k}{2}})的平方
当次数为奇数,调用并返回一个底数不变,次数除以二的幂的平方除以2

代码实现

long long x1,k11;
int pow(long long k,long long x){
    if(k == 1){
        return x;
    }else if(k % 2 == 0){
        long long a = pow(k/2,x);
        return a*a;
    }else if(k % 2 == 1){
        long long a = pow(k/2,x);
        return a*a/x;
    }
}
int main(){
    cin >> x1 >> k11;
    cout << pow(x1,k11);
    return 0;
}