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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

高效进行模幂运算

發布時間:2024/4/11 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高效进行模幂运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

高效進行模冪運算

文章目錄

    • 高效進行模冪運算
    • 一、題目描述
    • 二、分析
    • 三、代碼

一、題目描述

你的任務是計算 a^b 對 1337 取模,a 是一個正整數,b 是一個非常大的正整數且會以數組形式給出。

示例 1:

輸入: a = 2, b = [3] 輸出: 8

示例 2:

輸入: a = 2, b = [1,0] 輸出: 1024

二、分析

單就這道題可以有三個難點:

  • 一是如何處理用數組表示的指數,現在 b 是一個數組,也就是說 b可以非常大,沒辦法直接轉成整型,否則可能溢出。你怎么把這個數組作為指數,進行運算呢?
  • 二是如何得到求模之后的結果?按道理,起碼應該先把冪運算結果算出來,然后做 % 1337 這個運算。但問題是,指數運算你懂得,真實結果肯定會大得嚇人,也就是說,算出來真實結果也沒辦法表示,早都溢出報錯了。
  • 三是如何高效進行冪運算,進行冪運算也是有算法技巧的,如果你不了解這個算法,后文會講解。

那么對于這幾個問題,我們分開思考,逐個擊破。

如何處理數組指數:

  • 首先明確問題:現在 b 是一個數組,不能表示成整型,而且數組的特點是隨機訪問,刪除最后一個元素比較高效
  • 不考慮求模的要求,以 b = [1,5,6,4] 來舉例,結合指數運算的法則,我們可以發現這樣的一個規律:


看到這,我們的老讀者肯定已經敏感地意識到了,這就是遞歸的標志呀!因為問題的規模縮小了:

superPow(a, [1,5,6,4]) => superPow(a, [1,5,6])

那么,發現了這個規律,我們可以先簡單翻譯出代碼框架:

// 計算 a 的 k 次方的結果 // 后文我們會手動實現 int mypow(int a, int k);int superPow(int a, vector<int>& b) {// 遞歸的 base caseif (b.empty()) return 1;// 取出最后一個數int last = b.back();b.pop_back();// 將原問題化簡,縮小規模遞歸求解int part1 = mypow(a, last);int part2 = mypow(superPow(a, b), 10);// 合并出結果return part1 * part2; }

到這里,應該都不難理解吧!我們已經解決了 b 是一個數組的問題,現在來看看如何處理 mod,避免結果太大而導致的整型溢出。

如何處理 mod 運算:

  • 首先明確問題:由于計算機的編碼方式,形如 (a * b) % base這樣的運算,乘法的結果可能導致溢出,我們希望找到一種技巧,能夠化簡這種表達式,避免溢出同時得到結果。
  • 比如在二分查找中,我們求中點索引時用 (l+r)/2 轉化成 l+(r-l)/2,避免溢出的同時得到正確的結果。
  • 那么,說一個關于模運算的技巧吧,畢竟模運算在算法中比較常見:
    (a * b) % k = (a % k)(b % k) % k
證明很簡單,假設: a = Ak +B;b = Ck + D其中 A,B,C,D 是任意常數,那么: ab = ACk^2 + ADk + BCk +BDab % k = BD % k又因為: a % k = B;b % k = D所以: (a % k)(b % k) % k = BD % k 綜上,就可以得到我們化簡求模的等式了。
  • 換句話說,對乘法的結果求模,等價于先對每個因子都求模,然后對因子相乘的結果再求模。
  • 那么擴展到這道題,求一個數的冪不就是對這個數連乘么?所以說只要簡單擴展剛才的思路,即可給冪運算求模:

三、代碼

int base = 1337;// 計算 a 的 k 次方然后與 base 求模的結果 int mypow(int a, int k) {// 對因子求模a %= base;int res = 1;for (int _ = 0; _ < k; _++) {// 這里有乘法,是潛在的溢出點res *= a;// 對乘法結果求模res %= base;}return res; }int superPow(int a, vector<int>& b) {if (b.empty()) return 1;int last = b.back();b.pop_back();int part1 = mypow(a, last);int part2 = mypow(superPow(a, b), 10);// 每次乘法都要求模return (part1 * part2) % base; }
  • 你看,先對因子 a 求模,然后每次都對乘法結果 res 求模,這樣可以保證 res *= a 這句代碼執行時兩個因子都是小于base 的,也就一定不會造成溢出,同時結果也是正確的。
  • 至此,這個問題就已經完全解決了,已經可以通過 LeetCode 的判題系統了。
    但是有的讀者可能會問,這個求冪的算法就這么簡單嗎,直接一個 for 循環累乘就行了?復雜度會不會比較高,有沒有更高效地算法呢?
  • 有更高效地算法的,但是單就這道題來說,已經足夠了。
  • 因為你想想,調用 mypow 函數傳入的 k 最多有多大?k 不過是 b 數組中的一個數,也就是在 0 到 9 之間,所以可以說這里每次調用 mypow 的時間復雜度就是 O(1)。整個算法的時間復雜度是 O(N),N 為 b 的長度。

如何高效求冪:
快速求冪的算法不止一個,就說一個我們應該掌握的基本思路吧。利用冪運算的性質,我們可以寫出這樣一個遞歸式:

  • 這個思想肯定比直接用 for 循環求冪要高效,因為有機會直接把問題規模(b 的大小)直接減小一半,該算法的復雜度肯定是 log級了。
  • 那么就可以修改之前的 mypow 函數,翻譯這個遞歸公式,再加上求模的運算:
int base = 1337;int mypow(int a, int k) {if (k == 0) return 1;a %= base;if (k % 2 == 1) {// k 是奇數return (a * mypow(a, k - 1)) % base;} else {// k 是偶數int sub = mypow(a, k / 2);return (sub * sub) % base;} }

總結

以上是生活随笔為你收集整理的高效进行模幂运算的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 狠狠操夜夜操 | 日韩国产成人无码av毛片 | 涩涩小网站 | 麻豆传谋在线观看免费mv | www国产成人 | 天天色天天操天天射 | 亚洲在线国产 | 黄色的网站在线 | 久久mm | 91人妻一区二区三区蜜臀 | 撸久久| 麻豆 美女 丝袜 人妻 中文 | 亚洲第一页乱 | 美女爆乳18禁www久久久久久 | 男生女生搞鸡视频 | 国产主播精品 | 最近中文字幕在线观看视频 | 人妻丰满熟妇av无码区 | 中文字幕在线视频观看 | 国产视频第一页 | 亚欧成人在线 | 国产人妻人伦精品1国产盗摄 | 国产精品国产精品国产专区蜜臀ah | 亚洲天堂av影院 | 第四色影音先锋 | 日韩美一区二区三区 | www.555国产精品免费 | 中文字幕资源站 | 日韩在线网址 | 久久无码人妻丰满熟妇区毛片 | 精品国产高清在线观看 | 中文字幕av一区二区三区 | 光溜溜视频素材大全美女 | 色呦呦入口 | 欧美一区二区三区视频 | 90岁老太婆乱淫 | 欧美色视频在线观看 | 穿情趣内衣被c到高潮视频 欧美性猛交xxxx黑人猛交 | 伊人最新网址 | 黑人玩弄人妻一区二区三区 | 免费在线播放毛片 | 国产xxxxxx| 亚洲综合国产 | 特大黑人娇小亚洲女 | 人妻互换一二三区激情视频 | 国产麻豆成人 | 大尺度做爰呻吟62集 | 91在线亚洲 | 综合在线观看 | 美女视频毛片 | 国产精品久久久久久久久 | 日韩一区二区三区四区在线 | 国产主播一区 | 午夜视频免费在线观看 | 久久偷看各类女兵18女厕嘘嘘 | 国产精品一品二区三区的使用体验 | 夜夜嗨影院 | 男男啪啪网站 | 一区二区三区国产精品 | 国产免费av一区二区三区 | 手机在线看片1024 | av网站免费大全 | a√在线| 日日拍拍| 在线黄av | 色爽黄 | 跪求黄色网址 | 亚洲 欧美 日韩在线 | 久久77| 日韩人成 | 国产主播一区 | 一区二区三区av在线 | 天啪| 中国妇女做爰视频 | 中文字幕观看在线 | 乳女教师の诱惑julia | 天堂资源最新在线 | ts人妖在线 | 日日射日日操 | 男人的天堂网在线 | 让男按摩师摸好爽 | 97久久精品人人澡人人爽 | 久久看av | 午夜爱爱毛片xxxx视频免费看 | 亚洲一区欧美一区 | 日韩中文字幕网址 | 99爱在线 | 在线看b| 欧美小视频在线 | 欧美中文字幕在线播放 | 加勒比在线一区 | 狠狠网站| 欧美成人三级在线播放 | 色欧美日韩| 亚洲一区二区天堂 | 小早川怜子久久精品中文字幕 | 涩涩视频在线免费看 | 久久久久亚洲AV成人 | 国产美女精品视频国产 |