快速幂 模板

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

其核心思想就是
如果 k k 是偶数 那么 x ^ k = ( x ^ 2 ) ^ ( k / 2 )
如果 k k 是奇数 那么 x ^ k = x * ( x ^ ( k - 1 ) )
递归实现即可

#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;
}

另一种想法就是
如果 k k 是偶数 x ^ k = ( x ^ ( k / 2 ) ) ^ 2
如果 k k 是奇数 x ^ k = x * ( x ^ ( k / 2 ) ) ^ 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 & 1 1 = = == 0 的话,
注意& 按位与的优先级比 等号 低 ,要加括号

发布了5 篇原创文章 · 获赞 0 · 访问量 588

猜你喜欢

转载自blog.csdn.net/qq_45646484/article/details/104094801
今日推荐