【模板】快速幂 详解

我们知道,每个数都可以被拆分为若干指数不重复的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;
}

浙公网安备 33010602011771号