快速求正整数次幂

 思路:

把幂数转化成二进制求解:

例如:3的10次方,

我们把10转化成二进制,则变成1010

10 = (0 \times 2^0) + (1 \times 2^1) + (0 \times 2^2) + (1 \times 2^3)

3^{10} = 3^{(0 \times 2^0)} \times 3^{(1 \times 2^1)} \times 3^{(0 \times 2^2)} \times 3^{(1 \times 2^3)}

            = 3^{(0 \times 1)} \times 3^{(1 \times 2)} \times 3^{(0 \times 4)} \times 3^{(1 \times 8)}

           = 3^0 \times 3^2 \times 3^0 \times 3^8

设x=3,while(True) x = x*x;

就能得到  3^{2^1},3^{2^2},3^{2^3},3^{2^4} ....

 

3^{2^1},3^{2^2},3^{2^3},3^{2^4} ...., (x的变化规律)

3^0 \times 3^2 \times 3^0 \times 3^8 (数值3^10的拆解)

=1 \times 3^2 \times 1 \times 3^8

所以,我们只需要拿出二进制的每一位进行运算即可,如上图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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值