一、适用情况
求a的b次方(a ^ b);
如果b的值非常大,可以使用快速幂来降低时间复杂度;
时间复杂度为O(log b);
二、逻辑原理
当 b 为偶数时,a ^ b == a ^ ( b / 2 ) ^ 2 == ( a ^ 2 ) ^ ( b / 2 ),依据这个可以完成 b 的二次下降;
当 b 为奇数时,a ^ b == a * a ^ ( b - 1 ) ,此时,b - 1 为偶数;(相当于把奇数转换为偶数);
三、代码实现
快速幂代码
#define mod 998244353 // 一般指数运算太大 题目一般会要求mod
ll qpow(ll a , ll b ){
ll res = 1;
while(b){
if(b & 1) res = res * a % mod; // b 依次除以2 , 最后一定会为 1 , 此时可以将 a 乘到 res 上
a = a * a % mod;
b >>= 1; // 位运算 等价于 b /= 2;
}
return res;
}
可以测试的全部代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 998244353 // 一般指数运算太大 题目一般会要求mod
ll qpow(ll a , ll b ){
ll res = 1;
while(b){
if(b & 1) res = res * a % mod; // b 依次除以2 , 最后一定会为 1 , 此时可以将 a 乘到 res 上
a = a * a % mod;
b >>= 1; // 位运算 等价于 b /= 2;
}
return res;
}
void solve(){
ll a,b;
cin >> a >> b;
cout << qpow(a,b) << endl;
}
signed main(){
ll t;
cin >> t;
while(t--){
solve();
}
return 0;
}
标签:return,res,ll,while,mod,快速,define
From: https://blog.csdn.net/2401_87239144/article/details/144805256