高效的求大數的冪和取餘

做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);
  }
發佈了50 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章