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 很大时,避免乘法过程中的数据溢出,同样采用类似快速幂的二进制分解思想来进行乘法运算(即把乘法转化为加法)

posted @ 2025-08-21 11:16  ervgiu28hg34y827  阅读(13)  评论(0)    收藏  举报