如果我們要求乙個數x的n次冪,樸素的想法是讓n個x相乘。對與n很大的情況,會造成一定的時間浪費。
這裡講解一下o(nlogn)的快速冪解法
我們考察a^11 次方。我們將它的冪用二進位制形式表示(11轉化為二進位制是1011)也就是a^1011。我們將它再做一步轉換。二進位制
數字轉化成對應1相加的形式
得到:a^1011 = a^(1000 + 10 + 1) = a^1000 * a^10 * a^1 。 此時通過轉化完成後的式子很容易看出,真正對結果起作用的,只有二進位制裡面的1, 0並沒有什麼作用。
於是演算法的流程就是不斷考察冪二進位制形式的每一位。如果是0忽略,如果是1,就將其乘進答案裡。
我們的例子 a^1011 它的冪轉換成2進製一共有四位。
我們就準備好這些數 a^1000 * a^100 * a^10 * a^1 , 如果相應的冪的二進位制是1,我們就把其乘到答案裡,是0則忽略
於是以上的例子就是 a^1000 * a^10 * a^1
typedef long long ll;
ll quick_pow(ll a,ll n,ll m)
return res;
}
//(a * b)% mod = ( ( a % mod ) * ( b % mod ) ) % mod ;求模公式
int pow(int a, int b, int mod) //底數, 指數, 模
return ans;
}
快速冪取模運算
1.如果b是偶數,我們可以記k a2 mod c,那麼求 k b 2 mod c 就可以了。2.如果b是奇數,我們也可以記k a2 mod c,那麼求 k b 2 mod c a mod c k b 2 mod c a mod c就可以了。那麼我們可以得到以下演算法 演算法4 int ans 1 a...
快速冪模運算
經常碰到要求 a b c的題目,這個時候a,b,c一般都在int範圍內,但是a b可能就超出int表示的範圍了。這個時候要快速求解 a b c可以採用快速冪模運算,基本原理如下 a b modc amodc bmodc modc a b modc amodc b modc a b modc a bm...
整數快速冪以及大數取模快速冪運算
最近寫到快速冪的演算法題,就比如313,按照之前的做法無非不是寫個迴圈模擬計算,對於指數較小的情況的確可以完成,倘若指數過於大,程式會超時,此時就需要運用到快速冪的方法 正常情況下的計算時間複雜程度為o n a n a a a a n個a 但a和n過於大時我們可以換種思路,我們知道a n a m a...