题目大意:快速求$a^bmod p$的值。
根据二进制,令$b=sum t_kcdot 2^k, tin {0,1}$,那么$$a^b=a^{sum t_kcdot 2^k}mod p=prod a^{t_k cdot 2^k}mod p$$。$k$表示当前处理的$b$的二进制数的位数,$t_k$的取值取决于当前$b$的二进制位$k$上的值是$0$还是$1$。
同理,为了防止乘法越界,还要进行快速乘法。$$abmod p=sum t_kcdot acdot 2^kmod p$$,各项解释与上相同。
#include <cstdio>
using namespace std;
#define LL long long
LL mul(LL a, LL b, LL p)
{
LL ans = 0;
while (b)
{
if (b & 1)
ans = (ans + a) % p;
a = (a + a) % p;
b >>= 1;
}
return ans;
}
LL power(LL a, LL b, LL p)
{
LL ans = 1;
while (b)
{
if (b & 1)
ans = mul(ans, a, p);//更新
a = mul(a, a, p);//(a^2^k)^2=a^(2*2^k)=a^2^(k+1)
b >>= 1;//b的二进制下一位
}
return ans;
}
int main()
{
LL a, b, p;
scanf("%lld%lld%lld", &a, &b, &p);
printf("%lld^%lld mod %lld=%lld
", a, b, p, power(a, b, p));
return 0;
}