1. 程式人生 > 其它 >程式碼模板整理(3):快速冪

程式碼模板整理(3):快速冪

嚴謹的程式碼模板整理

快速冪

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;
}