求a^b mod 1337

b是各位数字存在数组中的大数

int superPow(int a, vector<int>& b) {
    // 幂太大,将幂分解。
    // 例如,37^213 mod K = 37^(210+3) mod K 
    //   = ((37^21 mod K)^10 mod K) * (37^3 mod K)
    if (b.empty()) return 1;
    const int K = 1337;
    int lastDigit = b.back(); b.pop_back();        
    return (pow(superPow(a, b), 10, K) * pow(a, lastDigit, K)) % K;
}

// 幂较小用该函数计算,a^b mod K
int pow(long a, int b, int K) {
    int ans = 1;
    while (b) {
        if (b & 1) ans = (ans * a) % K;
        a = (a * a) % K;
        b >>= 1;
    }
    return ans;
}

不用*、/,只用+、-、移位作两正数相乘

int minProduct(int a, int b) {
    if (a > b) swap(a, b);
    return rMinProduct(a, b);
}

int rMinProduct(int small, int big) {
    if (small == 0) return 0;
    if (small == 1) return big;

    int halfProd = rMinProduct(small >> 1, big);
    int prod = halfProd << 1;
    if (small & 1) prod += big;

    return prod;
}