Your task is to calculate ab mod 1337 where a is a positive integer and b is an extremely large positive integer given in the form of an array.
Example1:
a = 2 b = [3] Result: 8
Example2:
a = 2 b = [1,0] Result: 1024
This is another mathematical problem. The basic idea is to use exponentiation by squaring, i.e.:
x^n = x(n/2) * x(n/2) * x if n % 2 != 0
= x(n/2) * x(n/2) if n % 2 == 0
For the actual problem, since b is represented by array:
a^b = a^(10*len*b[len - 1] + ... + b[0]) = (a^(10 * len))^(b[len - 1])*...*(a^b[0])
Besides
(a * b) % c = ((a % c) * (b % c)) % c
public class Solution { private int modConstant = 1337; public int superPow(int a, int[] b) { int len = b.length; int rst = 1; for (int i = len - 1; i >= 0; i--) { rst = rst * quick_pow(a, b[i]) % modConstant; a = quick_pow(a, 10); } return rst; } int quick_pow(int a, int b) { int rst = 1; a %= modConstant; while (b > 0) { if (b % 2 !=0) rst = rst * a % modConstant; a = a * a % modConstant; b /= 2; } return rst; } }
No comments:
Post a Comment