Fast Pow
Take 2^5 for example, $2^5 = 2^{4+1} = 2^4 * 2^1$
Initially, base = 2, ans = 1, exp = 5 = (101)
Here, the rightmost 1 means that we should multiply ans by 2^1.
The middle 0 means that we should NOT multiply ans by 2^2.
The leftmost 1 means that we should multiply ans by 2^4.
In sum, we can keep doing exp >>= 1 and base = (base * base). We only do ans = (ans * base) when exp & 1 == 1.
Implementation
// Time: O(logE)
// Space: O(1)
int modpow(int base, int exp, int mod) {
base %= mod;
long ans = 1;
while (exp > 0) {
if (exp & 1) ans = ans * base % mod;
base = (long)base * base % mod;
exp >>= 1;
}
return ans;
}Or simply pre-compute those pows.
vector<int> p(exp + 1, 1);
for (int i = 1; i <= exp; ++i) p[i] = ((long long) p[i - 1] * base) % mod;If we want to reuse the result across test cases, we can use static vector.
static vector<int> p{1};
while (p.size() <= exp) p.push_back(((long long) p.back() * base) % mod);Problems
Last updated
Was this helpful?