二进制的应用
(龟速幂)
int power(int a, int b, int p) {
int ans = 1 % p;
for (; b; b>>=1) {
if (b & 1) ans = (long long)ans * a % p;
a = (long long)a * a % p;
}
return ans;
}
原理就是利用幂次的二进制数码中就天然表示了这个幂次的因子, 就利用该性质把幂次拆开,同时在拆分的过程中,处理了底数的不同的二次幂的值。
例题:Poj1995 Raising Modulo Numbers
同理可得(龟速乘)
ll mul(ll a, ll b, ll p) {
ll ans = 0;
for (; b; b >>= 1) {
if (b & 1) ans = (ans + a) % p;
a = a * 2 % p;
}
return ans;
}
原理同样是利用幂次将b展开,变为a乘以几个b分解出的因子为2的次方的形式。然后即为a乘以2的不同次方的和即为乘法的答案。这个方法可以处理正常乘法会溢出的情况。