題意:求b的p次冪對k取餘的結果
分析:先不考慮取餘的情況,我們來求b的p次
傳統思想上我們認為b的p次就是由p個b相乘得到的,所以就用一層for迴圈便可得到答案。如果用for迴圈你會驚奇的發現你tle了。這時候快速冪的好處就體現出來了。
首先應該知道的是任何數都能用二進位制表示出來。
對於乙個p我們可以用二進位制表示出來。假設p=6 他用二進位制表示出來是110. 按權值展開就是
p =0
∗20+
1∗21
+1∗2
2.
\ p = 0*2^+1*2^+1*2^\,.
p=0∗20
+1∗2
1+1∗
22.這時候
b p=
b0∗2
0+1∗
21+1
∗22=
b2∗b
4.
\ b^ =b^+1*2^+1*2^}=b^*b^\,.
bp=b0∗
20+1
∗21+
1∗22
=b2∗
b4.相信聰明的你已經看出了規律:b的p次可以用b的2的整數次冪的乘積表示,對於b的6次我們只要計算到b的4次就行了。然後根據p的二進位制形式,哪位上有1結果就成該位對應的權值即可.
對於取餘,首先得知道在過程中取餘不會對結果造成影響。所以只要乘的時候每次取一次就好了,不然會溢位。
下面附上**:
#include
using
namespace std;
#define ll long long int
ll b,p,k;
ll quick_mod
(ll a,ll b)
b>>=1;
//右移一位
a*=a;a%
=k;}
return ans%k;
}int
main()
P1226 模板 快速冪 取餘運算
原題 題目描述 輸入b,p,k的值,求b p mod k的值。其中b,p,k k為長整型數。輸入輸出格式 輸入格式 三個整數b,p,k.輸出格式 輸出 b p mod k s s為運算結果 輸入輸出樣例 輸入樣例 1 2 10 9 輸出樣例 1 2 10 mod 9 7 源 includeusing...
P1226 模板 快速冪 取餘運算
給你三個整數 b,p,k,求b的p次方mod k的值 輸入只有一行三個整數,分別代表 b,p,k 輸出一行乙個字串b p mod k s,其中 b,p,kb,p,k 分別為題目給定的值,ss 為運算結果。輸入 1複製 2 10 9輸出 1複製 2 10 mod 9 7對於乙個數的n次冪,我們可以將它...
洛谷P1226 快速冪取餘
模板模板快出來 模板如下 include include include using namespace std typedef long long ll typedef unsigned long long ull ll mod pow ull x,ull n,ull mod return res...