给我数字3和一个变量’n’,它可以高达1000000000000(十亿)。我必须打印的答案3^n modulo 100003。我尝试了以下方法:
3^n modulo 100003
std::pow(3,n)
因此,这些就是我的想法,如果有人认为有更好的方法(或者我的方法之一是最佳方法),我将不胜感激。
利用模块化算术的特性
(a × b) modulo M == ((a module M) × (b modulo M)) modulo M
通过使用上述乘法规则
(a^n) modulo M = (a × a × a × a ... × a) modulo M = ((a module M) × (a modulo M) × (a modulo M) ... × (a modulo M)) modulo M
通过分治法计算结果。重复关系将是:
f(x, n) = 0 if n == 0 f(x, n) = (f(x, n / 2))^2 if n is even f(x, n) = (f(x, n / 2))^2 * x if n is odd
这是C ++实现:
int powerUtil(int base, int exp, int mod) { if(exp == 0) return 1; int ret = powerUtil(base, exp / 2, mod) % mod; ret = 1LL * ret * ret % mod; if(exp & 1) { ret = 1LL * ret * base % mod; } return ret; } double power(int base, int exp, int mod) { if(exp < 0) { if(base == 0) return DBL_MAX; // undefined return 1 / (double) powerUtil(base, -exp, mod); } return powerUtil(base, exp, mod); }