问题
https://www.acwing.com/problem/content/877/
分析
暴力解法
直接计算 a i b i a_i^{b_i} aibi 然后再 m o d p i mod\ p_i mod pi ,程序执行次数最多为: b i ∗ n = 2 e 9 ∗ 1 e 5 = 2 e 14 b_i*n=2e9*1e5=2e14 bi∗n=2e9∗1e5=2e14 ,程序运行时间要求在 1.5s 内完成,明显超时
快速幂
整数 b b b 可以被拆成二进制表示,即 b b b 可以表示为 2 0 2 1 ⋯ 2 l o g b 2^0\ 2^1\ \cdots\ 2^{logb} 20 21 ⋯ 2logb 的组合
a b a^b ab 可以被拆成 a 2 0 a 2 1 ⋯ a 2 l o g b a^{2^0}\ a^{2^1}\ \cdots\ a^{2^{logb}} a20 a21 ⋯ a2logb 的乘积
维护两个数,一个是 b b b 的二进制表示,一个是 a a a 的二进制指数,通过不断的移位判断即可
代码
// 暴力解法
#include<iostream>
using namespace std ;
int main()
{
int n ;
cin >> n ;
while(n --)
{
int a, b, p ;
cin >> a >> b >> p ;
int res = 1 ;
while(b --)
res = res * a % p ;
cout << res << endl ;
}
return 0 ;
}
// 快速幂
#include<iostream>
using namespace std ;
typedef long long LL ;
int qmi(int a,int b, int p)
{
int res = 1 ;
while(b)
{
if(b & 1)
res = res * (LL)a % p ;
b >>= 1 ;
a = a * (LL)a % p ;
}
return res ;
}
int main()
{
int n ;
cin >> n ;
while(n --)
{
int a, b, p ;
scanf("%d%d%d", &a, &b, &p) ;
int res = qmi(a, b, p) ;
printf("%d\n", res) ;
}
return 0 ;
}