快速冪運算和快速冪取模運算

2021-08-31 21:28:23 字數 773 閱讀 1689

如果我們要求乙個數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...