知識點:快速冪運算
快速冪運算;
原來:當我們計算a^k時候,一定是(a*a*a*a*……a) k個
現在: 把k拆成二進位制,為了表達清楚,我們這裡讓k=11
11(dec)=1011(b)=1*2^3+0*2^2+1*2^1+1*2^0 我們會發現其中有0的地方是個廢操作
那麼我們將去除這個廢操作的過程叫做快速冪運算
2^11=2^1011=(2^1*2^3)*(2^
0*2^2
)*(1*2^1
) *(
1*2^0
)=(2^1*2^3)*
(1*2^1
) *(
1*2^0
)我們把上面的每一位的二進位製用b(i)表示 2^(b(i)*2^i)=
2^(b(i)*2^(i-1)*2)=
(2^(b(i)*2^(i-1)2))^2
=2^(b(i)*2^(i-1)2)*2^(b(i)*2^(i-1)2)
這麼做的目的是便於我們的演算法,後者=前者的平方
那麼演算法就寫好了
__int64(__int64 a,int k)
a=a*a//後者=前者的平方
k>>=1;// 將k右移移動一位,迴圈判斷二進位制是否是0,是0就不作運算
}returrn s;
}這樣就ok了。。。
快速冪運算
如果我們要求x n次方 當n很大的時候 會gg 這個時候就會用到快速冪演算法了,顧名思義,快速冪,快速求冪。因為任何乙個數都可以用2進製表示。比如9 2 3 2 0 7 2 2 2 1 2 0 所以我們可以把n看成 n 2 k1 2 k2 2 k3.這樣來表示。當然我們同樣可以把x用這樣表示。即 x...
快速冪運算
首先,快速冪的目的就是做到快速求冪,假設我們要求a b,按照樸素演算法就是把a連乘b次,這樣一來時間複雜度是o b 也即是o n 級別,快速冪能做到o logn 快了好多好多。它的原理如下 假設我們要求a b,那麼其實b是可以拆成二進位制的,該二進位制數第i位的權為2 i 1 例如當b 11時 a1...
快速冪運算
求 x n mod 當資料過大時,會造成溢位,因此無法得出正確的答案。已知取模運算的運算法則 a b p a p b p p 也就是如果我們要求 abc d a db dc d d 因此,我們可以借助這個法則,只需要在迴圈乘積的每一步都提前進行 取模 運算,而不是等到最後直接對結果 取模 也能達到同...