唯一分解定理
(質因數分解) 所有大於 \(1\) 的正整數都可以被唯一表示有限個質數的乘積形式(這個形式又可以叫標准分解式)
原理
通過篩法得到一個質數表,挨個挨個除,能整除多少次那這個質數就有多少次冪。枚舉質數的范圍應該是\(2\sim \sqrt{n}\)(這個的原因請看推論-因數的合數大小)。這樣把成對的因數除完還有可能剩下一個單獨的質因數,再單獨加到分解的結果中就可以了。
當然數據小的話不用質數表直接挨個枚舉也應該不是問題
代碼
(變量名與公式中的各項保持一致)
int pri[MX];//預處理完成后得到的質數表
int p[MX],a[MX];//p記錄所有質因數的值,a記錄所有質因數的冪,(記錄方式和之前的pri記錄方式一樣)
void PrimeDevide(int num){
for(int i=1;i<pri[0] && pri[i]*pri[i]<=num;i++){
if(num%pri[i]==0){//找到因數
p[++p[0]]=pri[i];
while(num%pri[i]==0){//將該因數除去並根據循環次數統計冪
a[p[0]]++;
num/=pri[i];
}
}
}
if(num!=1){//可能剩下單個質因數
p[++p[0]]=num;
a[p[0]]=1;
}
}
推論
合數的因數大小
若 \(n\) 為合數,則其標准分解式中必滿足 \(\exist \ p\ |\ n,\ p\leq \sqrt{n}\) (這個其實相當於是約數的性質)
理解
因為因數必然是成對存在的嘛,一個小於\(\sqrt n\),一個大於\(\sqrt n\),(假設兩個都小於,那么這兩個的乘積一定小於 \(n\) ;假設兩個都大於,那么這兩個的乘積一定大於 \(n\) 。兩個假設都矛盾,原結論得證)所以這個推論其實可以表示為通過確定 \(1\sim \sqrt{n}\) 范圍的所有因數就可以找到 \(n\) 所有成對的因數
因數個數公式
通過對標准分解式中各個質因數的組合可以枚舉出所有的因數,而這里組合的方案數就是因數的個數,它與標准分解式中質因數的指數是滿足乘法原理的:(這里設因數個數為 \(x\) )
理解
對於 \(n\) 的每一個因數,都必然也可以用 \(n\) 的標准分解式的形式表示出來,不過有一點不同:\(\alpha_i\)在這里是可以取到0的(也就是說這個因數不包含\(p_i\)這個質因子)。當我們要通過標准分解式構造因數時,每一個質因子的指數的不同的取法就是 \(0\sim\alpha_i\) 一共 \(\alpha_i+1\) 種,而且每一個質因子取多少次冪是獨立的,那么總共取出來的方案數也就必然滿足乘法原理,那么乘起來就好啦
因數和公式
同樣是通過改變標准分解式中質因數的指數來計算的,只不過我們將單純的質數相乘變成了這樣:(這里設因數和為\(sum\))
理解
如果只看一個質因數,那么在固定其他的情況下,這個因數就可以為因數和做出它所有次冪的貢獻,然后還是乘起來就行啦