计算a^b
正常用a*a*a*a……乘b次,时间复杂度为O(b)
用快速幂呢,就可以优化为O(log2 b)
例如
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算

也就是如果这一位二进制为1,在结果里乘上2的这一位次幂
反之则不乘
那么结果就是所有这些幂的乘积
b&1
//取b二进制的最低位,判断和1是否相同,相同返回1,否则返回0,可用于判断奇偶,可以用b%2!=0代替
b>>1
//把b的二进制右移一位,即去掉其二进制位的最低位,可以用b/=2代替
递归版
1 long long pow(long long a,long long i){ 2 if (i==0) return 1; 3 int temp=pow(a,i>>1); 4 temp=temp*temp%MOD; 5 if (i&1) temp=(ll)temp*a%MOD; 6 return temp%MOD; 7 }
非递归版
1 long long f(long long a,long long b,long long n) 2 { 3 int t,y; 4 t=1; 5 y=a; 6 while (b!=0) 7 { 8 if (b&1==1) t=t*y%n;//如果是奇数(这一位二进制是一),那么乘上去 9 y=y*y%n; //把a本身平方,算二进制下一位对应的2的次幂 10 b=b>>1;//b=b/2 11 } 12 return t; 13 }