快速幂

5 篇文章 0 订阅

快速幂顾名思义,就是快速算某个数的多少次幂。
其时间复杂度为O(log₂N),与朴素的O(N)相比效率有了极大的提高。


核心思想就是
如果 k k k是偶数 那么 x k = ( x 2 ) k 2 x^ k =(x^{2})^{\tfrac{k}{2}} xk=(x2)2k
如果 k k k是奇数 那么 x k = x ∗ x ( k − 1 ) x ^ k = x * x ^{ ( k - 1 ) } xk=xx(k1)
递归实现即可

#define LL long long
LL quickpow(LL x,LL k,LL mod)
{
	if(k==0) return 1;
	if(k&1) return x*quickpow(x,k-1,mod)%mod;
	else return quickpow(x*x%mod,k>>1,mod)%mod;
}

写成非递归形式

LL quickpow(LL x,LL k,LL mod)
{
	LL res=1;
	while(k) {
		if(k&1) res=res*x%mod;
		x=x*x%mod; k>>=1;
	}
	return res%mod; //注意要返回res%mod,hank 1^0(mod 1)
}

另一种想法就是
如果 k k k是偶数 x k = ( x k 2 ) 2 x^ k =(x^{\tfrac{k}{2}})^{2} xk=(x2k)2
如果 k k k是奇数 x k = x ∗ ( x k 2 ) 2 x ^ k = x * ( x ^{ \tfrac{k}{2}} ) ^ 2 xk=x(x2k)2

LL quickpow(LL x,LL k,LL mod)
{
	if(k==0) return 1;
	LL t=q_pow(x,k>>1,mod)%mod;
	if(k&1) return ((t*t%mod)*x)%mod;
	return t*t%mod;
}

另外,如果想写( k k k& 1 1 1 = = == == 0 的话,
注意& 按位与的优先级比 等号 低 ,要加括号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值