• 对于a^b,可以将b转化为二进制表示(10:1010),故a^b可拆分成a^b1*a^b2*……
  • 因此记录一个base=a,如果b的对应位为1,ans*=base
  • 最后再给base倍增:base*=a,b位移:b>>=1
#include<bits/stdc++.h>
using namespace std;
long long qpow(long long a,long long b,long long p){
    a%=p;
    long long ans=1;
    while(b){
        if(b&1)ans*=a%p;
        a*=a%p;
        b>>=1;
    }
    return ans%p;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        long long a,b,p;
        scanf("%lld%lld%lld",&a,&b,&p);
        printf("%lld\n",qpow(a,b,p));
    }
    return 0;
}