Loading

Loading

【模板】快速幂 详解

image

我们知道,每个数都可以被拆分为若干指数不重复的2的次幂之和。
eg: 13= 8 + 4 + 1 = 1*2^3 + 1*2^2 + 1*2^0
所以,我们可以将体中的指数 b 转换为2进制,拆分为$$\log_{2}{b} $$ 个数相乘。
这样时间复杂度就变成O(logn)级别了。

#include<bits/stdc++.h>
#define  ll  long long
using namespace std;

ll a,b,m,ans;
//快速幂模板
void qpow()
{
	//防止0次幂
	ans=1%m;
	//每次for循环,b往右移一位。
	for(;b;b>>=1)
	{
		//如果在最右边的位置上是1,则乘入该项
		if(b&1) ans=ans*a%m; 
		//a平方之后取模
		a=a*a%m;
	}
}
int main()
{
	cin>>a>>b>>m;
	printf("%lld^%lld mod %lld=",a,b,m);
	qpow();
	cout<<ans;
	return 0;
}
posted @ 2025-08-24 10:05  Miya555  阅读(16)  评论(0)    收藏  举报