做TopCoder SRM 576 D2 L3 題目時,程序有個地方需要對一個數大量求冪並取餘,導致程序運行時間很長,看了 Editoral 之後,發現一個超級高效的求冪並取餘的算法,之前做System test時,程序運行時間(最慢的測試用例)爲500ms左右,使用此方法之後,運行時間直接減爲20ms,快了20多倍,所以將此方法記錄下來。
算法時間複雜度爲 log(n)。
這個算法其實就是 數據結構與算法分析 (Weiss 著) 一書中開頭的那個遞歸求冪算法的非遞歸版,簡潔明瞭。
代碼如下:
// Finds x raised to the y-th exponent modulo MOD (即求 x^y % MOD)
const int MOD = 1e9 + 9;
int modPow(int x, int y)
{
long long res = 1, a = x;
while (y > 0) {
if (y & 1) {
res = (res * a) % MOD;
}
a = (a * a) % MOD;
y >>= 1;
}
return static_cast<int> (res);
}