U
long long qmm1(long long a, long long b, long long p)//快速乘函数
{
long long ans = 0;
while(b != 0)
{
if(b & 1 == 1)//判断 b 的二进制最低位是否为 1(即 b 是否为奇数)
ans += a, ans %= p;//对 p 取模,防止溢出
a = a + a, a %= p;//a乘以 2
b >>= 1;//除以 2
}
return ans;
}
long long qmi(long long a, long long k, long long p)//快速幂函
{
long long res = 1 % p;
while(k)
{
if(k & 1)//k 是否为奇数
res = qmm1(res, a, p) % p;
a = qmm1(a, a, p) % p;
k >>= 1;
}
return res;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
long long A, B, P, cnt;
scanf("%lld %lld %lld", &A, &B, &P);
cnt = qmi(A, B, P);
printf("%lld\n", cnt);
}
return 0;
◮:∵ B 可能很大,直接计算 Aᴮ会超出数据范围,所以采用快速幂结合快速乘的方法。快速幂的核心思想是将指数 B 进行二进制分解,通过迭代的方式,每次将指数缩小一半,同时对底数进行平方(并取模)。而快速乘是为了在计算过程中,当 A 和 B 很大时,避免乘法过程中的数据溢出,同样采用类似快速幂的二进制分解思想来进行乘法运算(即把乘法转化为加法)
浙公网安备 33010602011771号