a^16 = (a^8)^2 = ((a^4)^2)^2 = (((a^2)^2)^2)^2
循环16次 vs 循环3次

比如:
a^26 = a^16 * a^8 *a^2=(((a^2)^2)^2)^2 + ((a^2)^2)^2 + (a^2)
26 =16+8+2
26的二进制为11010

11010&1 = 0  a    ans=1     11010>>1 --> 1101   
1101&1 = 1   a^2  ans*=a^2  1101>>1 --> 110   
110&1 = 0    a^4            110>>1 --> 11
11&1 = 1     a^8  ans*=a^8  11>>1 --> 1  
1&1 = 1      a^16 ans*=a^16 1>>1 -->0

a^b mod b做法

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
int main(){
    ll a,b,p;
    scanf("%lld %lld %lld",&a,&b,&p);
    int ans=1;
    while(b){
        if(b&1) ans = ans*a%p;  //当b的最后一位为1 ,则将此时的a乘上
        b>>=1;                  //每次b向右移动一位,表示整除2
        a=a*a%p;                //每次让a翻倍
    }
    printf("%lld",ans%p);
    return 0;
}