longlongquickPow(int a,int n){ longlong result = 1; while(n>0){ // 如果n的二进制在某一位为1,则计算对应的幂 if(n&1) result *= a; // 更新a,为下一次计算作准备 a *= a; // 更新n,寻找下一个计算小任务 n >>= 1; } return result; }
进一步的,取模运算不影响乘法运算,对于某些需要进行取模的题目,可以有:
(a∗b)modm=(amodm)∗(bmodm)modm
1 2 3 4 5 6 7 8 9 10 11
longlongquickPow(int a,int n,int m){ a %= m; longlong result = 1; while(n>0){ if(n&1) result *= a%m; // 这里更新的结果是(a^x)%m a *= (a%m); n >>= 1; } return result; }