本质和快速幂的思路是一毛一样的,
b还是老规矩化成那个式子,我们就会神奇的发现,和快速幂相比不过是把a^–>a * ,把 a^(2) * a^(4) --> a^(2) + a^(4) 罢了,因为刚开始不是直接一直乘,而是加,所以res = 0即可
代码如下:
#include <cstdio>
#include <iostream>
using namespace std;
typedef unsigned long long ULL;
ULL powX(ULL a,ULL b,ULL p){
ULL res = 0;
while( b ){
if(b&1) res = (res+a)%p;
a = a*2%p;
b>>=1;
}
return res;
}
int main()
{
ULL a,b,p;
cin>>a>>b>>p;
cout<<powX(a,b,p);
return 0;
}