跳到主要内容

快速幂

参考资料

快速幂

快速幂(Binary Exponentiation)把指数 yy 按二进制拆分,每一步将底数平方,遇到为 11 的二进制位就把当前底数乘入答案,从而在 O(logy)O(\log y) 内求出 xymodpx^y\bmod p

116 Bcpp
ll Pow(ll x,ll y)
{
x%=mod;
ll res=1;
while(y)
{
if(y&1)res=res*x%mod;
x=x*x%mod;
y>>=1;
}
return res;
}

龟速乘

龟速乘用于计算 x×ymodpx\times y\bmod p,可以防止直接计算 x×yx\times y 过大导致溢出。

120 Bcpp
ll mul(ll x,ll y)
{
x%=mod;
ll res=0;
while(y)
{
if(y&1)res=(res+x)%mod;
x=(x+x)%mod;
y>>=1;
}
return res;
}

另外两种实现:

55 Bcpp
ll mul(ll a,ll b,ll mod)
{
return __int128(a)*b%mod;
}

例题

给定三个整数 a,b,pa,b,p,求 abmodpa^b\bmod p。(a,b,p<231a,b,p<2^{31}