有一些c語言的題目中可能要求a的b次方然後對c去模,也就是我們說的對c取餘,大多數情況下我們想乙個遍歷就好啦呀,是的,對於大多數情況下我們使用遍歷可以解決其中大部分的問題,可是如果資料很大,那麼超過計算機儲存的範圍該怎麼去解決呢?
首先我們來說一下快速冪取模的思路:
快速冪具體分析:對a^b進行分析。
對於當a和b較小是直接用int或者long存是沒有問題的,但是當a和b大到一定程度時,這就不是暴力存就
可以解決的問題了。我們應該怎麼去解決這個問題呢?
在這裡我們需要把注意力放在「大」字上面,正是由於a和b過大才導致的問題。所以我們要想辦法不斷地減
小a和b的規模,所謂逐個擊破。
根據上面的那條引理,我們知道了可以把指數拆開,從這個突破口突破。這裡我們就不難想到這樣乙個演算法:
int a,b,c;
//a是底數,b是冪指數,c是模;
int sum=1;
a=a%c;
for(i=1;i<=b;i++)
sum=sum%c;
這樣我們的確對資料量進行了優化,可是還不夠,我們只對a進行了優化,那我們如何去改變b的資料量呢?
我們看乙個公式:
看到這兒你可能會明白怎麼處理b的值,就是不斷的分解b,我們來看**:
long long mode(long long a, long long b, long long mode)
return sum;
}
希望對大家的學習有所幫助。 快速冪 快速冪取模
快速冪的思想在於快速求解高冪指數的冪運算 複雜度為o log2n 與樸素運算相比有很大的改進 接下來給出 其中有詳解 include include using namespace std typedef long long ll ll pow1 int a,int b 最常規的方法 將冪指數轉化為...
快速冪 快速冪取模
求x m 一般方法是 xm x xm 1,這樣需要做m次乘法,未免過慢。加速方法有兩種。1.基於當m為偶數時,xm x2 m 2 當m為奇數時,xm x xm 1。顯然當m為偶數時m會減半,當m為奇數時,下次就是偶數。m可以很快收斂到0.表示冪 2.將m看成二進位制串mkmk 1 m1m0,那麼xm...
快速冪 快速冪取模
原文 快速冪這個東西比較好理解,但實現起來到不老好辦,記了幾次老是忘,今天把它系統的總結一下防止忘記。首先,快速冪的目的就是做到快速求冪,假設我們要求a b,按照樸素演算法就是把a連乘b次,這樣一來時間複雜度是o b 也即是o n 級別,快速冪能做到o logn 快了好多好多。它的原理如下 假設我們...