Para esse problema, o uso de travessia comum é um pouco inadequado, a complexidade é muito alta.
Aqui você pode usar o método de potência rápida baseado na idéia de dicotomia, também chamada dicotomia. Como segue:
typedef long long LL;
//递归的写法
LL BINARYPOW(LL a,LL b,LL m){
if(b==0) return 1;
//b为奇数,转换为b-1
if(b%2==1) return a*binaryPow(a,b-1,m)%m;
else{
LL mul=binaryPow(a,b/2,m);
return mul*mul%m;
}
}
A condição if (b% 2 == 1) pode ser substituída por if (b & 1), porque b & 1 está localizado na operação e avalia se o último bit de b é 1; portanto, quando b é ímpar, b & 1 retorna 1 e a condição if é estabelecida.