解题思路
暴力做法:
- 直接计算 并取模
- 单次询问时间复杂度:
- 空间复杂度:
- 这样会超时,需要使用快速幂算法进行优化。
快速幂原理:
- 将指数 转换为二进制
- 根据二进制位计算结果
- 每次平方并取模
代码
#include <iostream>
using namespace std;
// 快速幂计算 (a^b) % p
long long quickPow(long long a, long long b, long long p) {
long long res = 1;
a %= p;
while(b) {
if(b & 1) {
res = (res * a) % p;
}
a = (a * a) % p;
b >>= 1;
}
return res;
}
int main() {
int q;
cin >> q;
while(q--) {
long long a, b, p;
cin >> a >> b >> p;
cout << quickPow(a, b, p) << endl;
}
return 0;
}
import java.util.*;
public class Main {
static long quickPow(long a, long b, long p) {
long res = 1;
a %= p;
while(b > 0) {
if((b & 1) == 1) {
res = (res * a) % p;
}
a = (a * a) % p;
b >>= 1;
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int q = sc.nextInt();
while(q-- > 0) {
long a = sc.nextLong();
long b = sc.nextLong();
long p = sc.nextLong();
System.out.println(quickPow(a, b, p));
}
}
}
def quick_pow(a, b, p):
res = 1
a %= p
while b:
if b & 1:
res = (res * a) % p
a = (a * a) % p
b >>= 1
return res
q = int(input())
for _ in range(q):
a, b, p = map(int, input().split())
print(quick_pow(a, b, p))
算法及复杂度分析
时间复杂度:
- 每次快速幂:
- 次查询: 空间复杂度:
-
优化技巧:
// 初始取模 a %= p; // 位运算判断奇偶 if(b & 1) // 右移代替除2 b >>= 1
-
注意事项:
- 数据范围:
- 中间结果可能溢出
- 需要使用 long long类型