日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

快速幂+快速幂取模

發布時間:2025/3/21 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速幂+快速幂取模 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

快速冪是優化的冪運算算法。
快速冪取模是快速冪+同余定理。

一、暴力冪運算

考慮計算 311,可以讓3累乘11次,復雜度是O(n)

int Pow1(int a, int b) {int ans = 1;for (int i = 0; i < b; i++) ans *= a;return ans; }int main() {cout << Pow1(3, 11) << endl;return 0; }

輸出:

177147

二、快速冪

以 311 舉例。把指數11寫成二進制形式是1011,所以
11 = 23 + 0 × 22 + 21 + 20

所以 311 又可以寫成:
311 =3^ (23 + (0 × 22) + 21 + 20)

拆括號得:
311 = 38 × (0 × 34) × 32 × 31

可以發現乘法因子是以平方的形式增長的,比如 32 等于 31 的平方,38 等于 34 的平方。
由此規律,可以寫出快速冪算法了。
我們先定義一個ans=1來保存答案,然后從低到高遍歷指數b的每一個二進制位,同時我們讓底數a隨著循環每次做一個平方,a, a2, a4, a8,…。
可以寫出快速冪的框架:

int Pow(int a, int b) {int ans = 1;while (b) {...a *= a;b >>= 1;}return ans; }

因為11是1011,311 = 38 × (0 × 34) × 32 × 31,可以發現,當二進制位等于1時,ans要累乘一次a。因此完整代碼如下:

#include <iostream> using namespace std;int Pow(int a, int b) {int ans = 1;while (b) {//因為1的二進制是0000 0001,所以 b & 1 為真就意味著 b 的最低位是1。if (b & 1) ans *= a;a *= a;b >>= 1;}return ans; }int main() {cout << Pow(3, 11) << endl;return 0; }

以上就是快速冪算法的分析。

三、快速冪取模

快速冪取模可以用來解決 “1145141919810 除以6的余數等于多少”或者是“230的后6位是多少”之類的問題。它是在快速冪的基礎上,結合了同余定理。

#include <iostream> using namespace std;int Pow(int a, int b, int c) {int ans = 1;while (b) {if (b & 1) ans = ans * a % c;a = a * a % c;b >>= 1;}return ans; }int main() {cout << Pow(114514, 1919810, 6) << endl;cout << Pow(2, 30, 1000000) << endl;return 0; }

輸出:

4 741824

總結

以上是生活随笔為你收集整理的快速幂+快速幂取模的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。