核心思想是二进制转十进制
比如需要求
a11
11的二进制表示为1011
∵11=23∗1+22∗0+21∗1+20∗1
∴a11=a23∗a21∗a20
运用位运算,就可以方便地快速幂
代码是对某一个数取模,洛谷上有相应的模板题
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long LL;
LL b, p, k, ans = 1;
LL fpower(LL b, LL p, LL k) {
for(; p; p >>= 1, b = ((b%k)*(b%k))%k)
if(p&1)
ans = ((ans%k)*(b%k)) % k;
return ans % k;
}
int main() {
cin >> b >> p >> k;
cout << fpower(b, p, k);
return 0;
}
时间复杂度大概达到O(logn)