思路:
把幂数转化成二进制求解:
例如:3的10次方,
我们把10转化成二进制,则变成1010
即
即
设x=3,while(True) x = x*x;
就能得到 ,
, (x的变化规律)
(数值3^10的拆解)
=
所以,我们只需要拿出二进制的每一位进行运算即可,如上图3行,可以得出
当二进制位是0时,就乘1,当二进制位是1时,就乘x
其中,当从二进制拿出0的时候,最终运算会得出1,例如 3^(0*2^2)=1,所以当累乘遇到0的时候,我们可以不计算
#define mod 1000000007
typedef long long ll;
inline ll xpow(ll x, ll m) { //x:底数;m:指数
ll ans = 1;//最终结果
while (m) {
if (m & 1)ans *= x;//对幂看成二进制,然后分别对二进制的每一位进行运算
x *= x; //对底数进行累乘 3^1 3^2 3^4 3^8 ..... 3^(2^n)
if (x >= mod)x %= mod;
if (pow >= mod)ans %= mod;
m >>= 1;
}
return ans;
}