2026年5月5日预计 3 分钟阅读OI

快速幂

zbl2012
zbl2012博主 & 创作者

快速幂是很多数学题的最基本的东西,是一种可以在 O(logn)O(\log n) 的复杂度求解 ana^n 的问题的算法。

一般来说,求解 ana^n 的问题要循环 nn 次,每次乘 aa,时间复杂度 O(n)O(n)。 但是快速幂用到了一个性质:任何一个正整数都可以写成几个 22 的次幂的和,其实就是可以转换成二进制。 所以可以将 ana^n 转换成:

n=2x1+2x2+2x3+...+2xt,tlognn=2^{x_1}+2^{x_2}+2^{x_3}+...+2^{x_t},t\le\log n

ana^n 变为:

an=a2x1+2x2+2x3+...+2xt=a2x1×a2x2×a2x3×...×a2xta^n=a^{2^{x_1}+2^{x_2}+2^{x_3}+...+2^{x_t}}=a^{2^{x_1}}\times a^{2^{x_2}}\times a^{2^{x_3}}\times...\times a^{2^{x_t}}

剩下的预处理解决即可,也可以边做边出来。

因为 tlognt\le \log n,所以时间复杂度是 O(logn)O(\log n)

注意点 1.注意取模,取模不当很容易爆。

code

P1226 【模板】快速幂

cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll qpow(ll a,ll b,ll p){
	ll ans=1;
	a%=p;
	while(b){
		if(b&1){
			ans*=a%p;
			ans%=p;
		}
		a=a*a%p;
		a%=p;
		b>>=1;
	}
	return ans;
}
int main(){
	ll a,b,p;
	cin>>a>>b>>p;
	cout<<a<<'^'<<b<<" mod "<<p<<'='<<qpow(a,b,p);
	return 0;
}

文章留言区

已有 0 条精彩探讨

正在拼命加载留言中...

发表您的见解

※ 提倡客观理性讨论。留言需要经过安全核查,请勿注入恶意链接。
上一篇文章树的直径下一篇文章 逆元