快速乘:(a*b)%p
while
(b)//把b看成二進位制
a=(a*2
)%p;
//(2)式 要採用遞推+取模的方法得到
b=b>>1;
//右移一位
}printf
("%lld"
,ans)
;
推導過程:
(a*2^k1+a*2^k2+a*2^k3+...+a*2^kn)%p=((a*2^k1+a*2^k2+a*2^k3+...+a*2^kn-1)%p+a*2^kn%p)%p,
等號左邊為前n項的結果,等號右邊含%p的第一項為前n-1項的結果,含%p的第二項可看成遞推關係,由此可得到(1)式,ans用於儲存計算結果,a為(2)式,除此之外還可注意到最後結果即ans,不用再取模。
快速冪:(a^b)%p
while
(b)//把b看成二進位制,根據b的每一位看乘不乘當前a
a=a*a%p;
//(2)式 更新a
b=b>>1;
//b向前移位
}printf
("%lld"
,ans)
;
推導過程:
a^(2^k1+2^k2+2^k3+2^k4+...+2^kn)%p=((a^2^k1)*(a^2^k2)*(a^2^k3)*(a^2^k4)*...*(a^2^k(n-1))*(a^2^kn))%p=(((a^2^k1)*(a^2^k2)*(a^2^k3)*(a^2^k4)*...*(a^2^k(n-1)))%p* ((a^2^kn)%p))%p
,第二個等號左邊為前n項的結果,第二個等號右邊含%p的第一項為前n-1項的結果,含%p的第二項可看成遞推關係,由此可得到(1)式,ans用於儲存計算結果,a為(2)式,除此之外還可注意到最後結果即ans,不用再取模。對於a=(a^2^kn)%p
,可看成從第1項遞推到第n項的結果,根據二進位制的權值可知,後一項等於前一項乘以a^2
,即a*a
,令an=(a^2^kn)%p
,則可推出an=a(n-1)*a*a%p
。
快速冪 與 快速乘
快速冪 傳統求a b非常的耗時間,那麼有沒有一種更快的方法去求這個呢 下面介紹一次快速冪 以求a的b次方來介紹 把b轉換成二進位制數 以a 11為例 b的二進位制數為1011,二進位制從右向左算,但乘出來的順序是 a 20 a 21 a 23 是從左向右的。我們不斷的讓base base目的是累乘,...
快速冪與快速乘
題目描述 求 a 的 b 次方對 p 取模的值,其中 0 a,b 10 9 0輸入 三個用空格隔開的整數a,b和p。輸出 乙個整數,表示a b mod p的值。樣例輸入 2 3 9 樣例輸出8思路 普通求冪時間複雜度為o b 會tle 設b的二進位制表示有k位,ci為0或1,則 b sum limi...
快速冪 快速乘
直接求解,需要迴圈b次。思路 將b轉化為二進位制。對應為1的次數的冪保留,只需要將保留的冪的結果進行乘積就是a b。class solution def fast self,a,b b bin b 2 res 1for i in b 1 if i 1 res res a a a return res...