【题解提供者】吴立强
解法一
思路
直接采用快速幂算法,注意到算法中包含乘法,而直接乘会溢出,那么再用龟速乘(快速幂改)的乘法即可通过本题。
代码
#include <iostream>
using namespace std;
typedef long long ll;
ll fmul(ll a, ll b, ll p) { /// 龟速乘
ll ans = 0;
while(b) {
if(b & 1) ans = (ans + a) % p;
a = (a + a) % p;
b >>= 1;
}
return ans;
}
ll fpow(ll a, ll b, ll p) { /// 快速幂
ll ans = 1;
while(b) {
if(b & 1) ans = fmul(ans, a, p);
a = fmul(a, a, p);
b >>= 1;
}
return ans % p;
}
int main() {
ll a, b, p; cin >> a >> b >> p;
cout << fpow(a, b, p);
return 0;
}
算法分析
本算法的时间复杂度为 O ( log ( b ) × log ( 1 0 18 ) ) O(\log(b)\times\log(10^{18})) O(log(b)×log(1018))。