Super Pow

medium math modular pow

Problem

Compute a^b mod 1337 where b is given as a non-empty array of digits (most significant first).

Inputa = 2, b = [1, 0]
Output1024
Horner: result starts at 1, then for each digit d → result = (result^10 · a^d) mod 1337.

MOD = 1337

def super_pow(a, b):
    a %= MOD
    res = 1
    for d in b:
        res = pow(res, 10, MOD) * pow(a, d, MOD) % MOD
    return res
const MOD = 1337;
function modpow(x, n) {
  x %= MOD;
  let r = 1;
  while (n > 0) {
    if (n & 1) r = (r * x) % MOD;
    x = (x * x) % MOD;
    n >>= 1;
  }
  return r;
}
function superPow(a, b) {
  a %= MOD;
  let res = 1;
  for (const d of b) {
    res = (modpow(res, 10) * modpow(a, d)) % MOD;
  }
  return res;
}
class Solution {
    static final int MOD = 1337;
    int modpow(int x, int n) {
        x %= MOD; long r = 1, b = x;
        while (n > 0) {
            if ((n & 1) == 1) r = r * b % MOD;
            b = b * b % MOD; n >>= 1;
        }
        return (int) r;
    }
    public int superPow(int a, int[] b) {
        a %= MOD;
        long res = 1;
        for (int d : b) res = (long) modpow((int) res, 10) * modpow(a, d) % MOD;
        return (int) res;
    }
}
const int MOD = 1337;
int modpow(int x, int n) {
    x %= MOD; long r = 1, b = x;
    while (n > 0) {
        if (n & 1) r = r * b % MOD;
        b = b * b % MOD; n >>= 1;
    }
    return (int) r;
}
int superPow(int a, vector<int>& b) {
    a %= MOD;
    long res = 1;
    for (int d : b) res = (long) modpow(res, 10) * modpow(a, d) % MOD;
    return (int) res;
}
Time: O(|b|) Space: O(1)