题目大意:快速求$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; }