この問題では、通常のトラバーサルを使用することは少し不適切であり、複雑さが高すぎます。
ここでは、二分法とも呼ばれる二分法のアイデアに基づく高速電力法を使用できます。次のように:
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;
}
}
条件if(b%2 == 1)はif(b&1)に置き換えることができます。これは、b&1が演算に配置され、bの最後のビットが1かどうかを判断するため、bが奇数の場合、b&1は1を返し、if条件が成立するためです。