由于有对p取模的操作,就显然不是高精度算法,而且p的范围在long long以内。所以我们不妨试试位运算,并结合一下快速幂的思想。
我们可以将b转成2进制数。eg. ∵11 =1011(2) = 1 * 2^3 + 0 * 2^2 + 1 * 2^1 +1 * 2^0,∴2*11 = 2*(1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0) = 2*(2^3) + 2*(2^1) + 2*(2^0)
因此,我们只需要将b的二进制数从最低位开始判断,如果该数位上的数是0就不计算,否则进行累加。代码如下:
#include <stdio.h>
typedef long long ll;
ll mul(ll a, ll b, const ll &p){
long long ans = 0;
for(; b; b >>= 1){
if(b & 1) ans = (ans + a) % p;
a = (a << 1) % p;
}
return ans;
}
int main(){
ll a, b, p;
scanf("%lld%lld%lld", &a, &b, &p);
printf("%lld\n", mul(a, b, p));
return 0;
}
赶快拿去欺负萌新~