以下以求a的b次方來介紹
把b轉換成二進位制數
該二進位制數第i位的權為
例如11的二進位制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我們將a¹¹轉化為算
對於 令a[0]=a^(2^0)*1 a[1]=a^(2^1)*1 a[2]=a^(2^2)*0 a[3]=a^(2^3)*1
可以看出a[n]的前半部分是a[n-1]前半部分的平方倍 則可以一直迴圈推(a^(2^k))^2,從右到左依次取b二進位制數的位數 如果是0則不乘入答案 如果是1則乘入答案(無論乘入不乘入 一直將a的平方推下去(就前邊辣個))
直到b為0跳出迴圈
必備的知識
對於取模運算:(a*b)%c=(a%c)*(b%c)%c 成立
//實際上
(a + b) % p = (a%p + b%p) %p
(a - b) % p = (a%p - b%p) %p 也成立
但是除法不成立 可以舉例證明
位運算 <
>>k 右移二進位制數 相當於除2^k
&且 1&1=1 | 或 1|1=1
1&0=0 1|0=1
0&1=0 0|1=1
0&0=0 0|0=0
1//實現**2//
mod c34
int quick(int a,int b,int
c) 5
14return
ans;
15 }
快速冪 快速冪取模演算法
在平時我們需要求乙個a b時,一般會用c 自帶的pow 函式對吧,可是加入資料十分大時,pow 是十分慢的,這個時候我們需要乙個能高效求出a b的演算法,這這時就出現了快速冪演算法。假如我們需要求3 999,那麼我們是不是可以發現3 999 3 512 256 128 64 32 4 2 1 3 5...
快速冪運算和快速冪取模運算
如果我們要求乙個數x的n次冪,樸素的想法是讓n個x相乘。對與n很大的情況,會造成一定的時間浪費。這裡講解一下o nlogn 的快速冪解法 我們考察a 11 次方。我們將它的冪用二進位制形式表示 11轉化為二進位制是1011 也就是a 1011。我們將它再做一步轉換。二進位制 數字轉化成對應1相加的形...
快速冪取模運算
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...