[算法/模板]質因數分解



一、質因數分解的基本定理

\(\forall N \in (1,\infty)\)都能唯一分解成有限個質數的乘積,可寫作:

\[N=P_1^{c_1}P_2^{c_2}...P_m^{c_m} \]

其中\(c_i\)為正整數,\(P_i\)都是質數,且滿足\(P_1\lt P_2\lt ...\lt P_m\)

我們可以掃描2~\(\sqrt N\)的每個數k,若k能整除N,那么我們從N中除掉所有的因子k,同時累計被除去的k的個數。
因為一個合數的因子一定在掃描到這個合數之前就從N中被除去了,因此掃描到能整除N的數一定是質數。
需要注意的是,若最終N沒有被[2,\(\sqrt N\)]的數整除,則N為質數,直接累計就可以了。
綜上,質因數分解的時間復雜度為\(O(\sqrt N)\)

二、模板-質因數分解

代碼如下:

inline void Divide(){
	cnt=0;
	for(int i=2;i<=sqrt(n);i++){
		if(n%i==0){
			p[++cnt]=i;
			while(n%i==0){
				num[cnt]++;
				n/=i;
		        }
           }
       }
	if(n>1){
		p[++cnt]=n;num[cnt]=1;
	}
}//其中p為底數,num為對應的指數 

pic.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM