程式碼模板整理(3):快速冪
阿新 • • 發佈:2022-06-06
嚴謹的程式碼模板整理
快速冪
2.快速冪
快速冪求的是什麼
$$
求a^b \ mod\ p
$$
快速冪的範圍可以到多少
$$
0\le a,b<2^{31},a+b>0,2\le p<2^{31}
$$
快速冪怎麼求
數學 $+$ 遞迴 $+$ 遞推
快速冪的具體求法
首先,考慮到資料範圍,我們採取 $unsigned$ $long$ $long$ 的型別儲存資料
然後,考慮到$a$的指數$b$可以被二進位制地拆分為$1,2,4,8...$這些數,分別對應了二進位制中的各個權值
因此, 用一個$base$作為權值,用$b$&$1$來判斷該二進位制位上的數是否為$1$,然後計算乘積,最後$base$自我昇華
程式碼如下
$A.\ a^b$
unsigned long long ksm(unsigned long long a,unsigned long long b) {
unsigned long long ans=1,base=a;
while(b>0) {
if(b&1)ans*= base;
base*=base;
b>>=1;
}
return ans;
}
$B. \ a^b \ mod \ p$
unsigned long long ksm(unsigned long long a,unsigned long long b,unsigned long long p) { unsigned long long ans=1,base=a; while(b>0) { if(b&1)ans*= base; ans%=p; base*=base; base%=p; b>>=1; base%=p; } return ans; }