关于Leetcode中的Super Pow 一题有几种不同的解法,在Leetcode的discuss板块中,我发现了一种很棒的解题思路,顺便翻译一下(加深记忆)。
作者:fentoyal
地址:C++ Clean and Short Solution
翻译如下:
同余模定理: ab%k=(a%k)∗(b%k)%k
由于幂存放在数组中,我们最好将它一位一位的处理。
通过观察可知:(其实为了便于理解可以先将取模的过程去掉,这里保留原式子)
a1234567%k=(a1234560%k)∗(a7%k)%k=(a123456%k)10%k∗(a7%k)%k
看起来有点复杂?让我们采取另一种表达方式:
假设
f(a,b)
表示计算
ab%k
然后利用该函数表示上面的公式:
f(a,1234567)=f(a,1234560)∗f(a,7)%k=f(f(a,123456),10)∗f(a,7)%k
代码实现如下:
class Solution {
const int base = 1337;
int powmod(int a, int k) //a^k mod 1337 where 0 <= k <= 10
{
a %= base;
int result = 1;
for (int i = 0; i < k; ++i)
result = (result * a) % base;
return result;
}
public:
int superPow(int a, vector<int>& b) {
if (b.empty()) return 1;
int last_digit = b.back();
b.pop_back();
return powmod(superPow(a, b), 10) * powmod(a, last_digit) % base;
}
};
Note: 这种方法显然不是最快的,但是当我们在面试中被问到这个问题时可以很快的理解并写出。还有这个方法没有使用内建的pow
函数,我想这也是面试官所期待的。
希望它对你有帮助!