一、定理內容
算術基本定理,又名唯一分解定理。若\(a>1\),那么必有\(a=p_1 ^ {\alpha _1}p_2^{\alpha _2}...p_s^{\alpha _s}\),其中\(p_j(1<=j<=s)\)是兩兩不相同的質數,\(a_j(1<=j<=s)\)表示對應質數的冪次(出現的次數)。若在不計次序的意義下,該分解式是唯一的。
二、分解質因數
/**
* 功能:分解質數因數
* @param x 待分解的數字
* @param a 分解后的數組
* @return 數組的最后一個元素下標
*/
int Decomposition(int x, int a[]) {
int cnt = 0;
for (int i = 2; i <= x / i; i++)
while (x % i == 0) {
x /= i;
a[++cnt] = i;
}
if (x > 1)a[++cnt] = x;
return cnt;
}
const int N = 110;
int a[N];
//用法:
int cnt = Decomposition(12, a);
for (int i = 1; i <= cnt; i++) cout << a[i] << " ";
三、推論1
\(d\)是\(a\)的約數的充要條件是:
\(a=p_1^{\alpha _1}p_2^{\alpha _2}...p_s^{\alpha _s}\)
\(d=p_1^{e_1}p_2^{e_2}...p_s^{e_s}\),\(0<=e_j<=a_j\),\(1<=j<=s\),即\(d\)中每個質數的冪次都不超過\(a\)的冪次。
這個推論用人話說就是:
如果\(d|a\),那么必然:
(1)、\(d\)里的每一個因子,都能在\(a\)的因子中找到。
(2)、\(d\)中每一個因子的冪,必須小於等於\(a\)中同因子的冪。
(3)、如果有一個因子在\(a\)中存在,而在\(d\)中不存在,可以認為此因子在\(d\)中也存在,只是冪為\(0\)。
四、推論2
\(a=p_1^{\alpha _1}p_2^{\alpha _2}...p_s^{\alpha _s}\)
\(b=p_1^{\beta _1}p_2^{\beta _2}...p_s^{\beta _s}\)
(這里允許某些\(\alpha _j\)或\(\beta _j\))為零,那么\((a,b)=p_1^{\delta _1}p_2^{\delta _2}...p_s^{\delta _s}\) ,\(\delta _j=min(\alpha _j,\beta _j)\),\(1<=j<=s\),以及\([a,b]=p_1^{\gamma _1}p_2^{\gamma _2}...p_s^{\gamma _s}\),\(\gamma _j=max(\alpha _j,\beta _j)\),\(1<=j<=s\)。
舉個栗子:
\(10=2\times 5,16=2^4\),那么
\((10,16)=2^{min(1,4)} \times 5 ^{min(1,0)}=2^1\times 5^0=2\)
\([10,16]=2^{max(1,4)}\times 5 ^{max(1,0)}=2^4\times 5^1=80\)
五、約數個數定理
對於一個大於\(1\)正整數\(n\)可以分解質因數:\(n=p_1^{a_1}*p_2^{a_2}*p_3^{a_3}*…*p_k^{a_k}\)
\(n\)的約數個數=\((a_1+1)(a_2+1)(a_3+1)…(a_k+1)\)個
注意:這里約數的個數只與冪有關,與具體是哪個質數因子無關!
舉個栗子:
例題:正整數\(378000\)共有多少個正約數?
解:將\(378000\)分解質因數\(378000=2^4×3^3×5^3×7^1\)
由約數個數定理可知\(378000\)共有正約數\((4+1)×(3+1)×(3+1)×(1+1)=160\)個。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 110;
const int mod = 1e9 + 7;
int main() {
int n;
cin >> n;
//記錄質數因子及個數
unordered_map<int, int> primes;
while (n--) {
int x;
cin >> x;
for (int i = 2; i <= x / i; i++)
while (x % i == 0) {
x /= i;
primes[i]++;
}
//如果還有大因子,那就加上
if (x > 1) primes[x]++;
}
//公式
LL res = 1;
for (auto p: primes) res = res * (p.second + 1) % mod;
//輸出結果
cout << res << endl;
return 0;
}
六、約數和定理
對於一個大於\(1\)正整數n可以分解質因數:\(n=p_1^{a_1}*p_2^{a_2}*p_3^{a_3}*…*p_k^{a_k}\),
\(n\)的正約數個數=\((a_1+1)(a_2+1)(a_3+1)…(a_k+1)\)個,
那么\(n\)的\((a_1+1)(a_+1)(a_+1)…(a_+1)\)個正約數的和為
\(n\)的約數和\(=(p_1^0+p_1^1+p_1^2+…p_1^{a_1})(p_2^0+p_2^1+p_2^2+…p_2^{a_2})...(p_k^0+p_k^1+p_k^2+…p_k^{a_k})\)
注意:這里約數和不光與冪有關,還與具體是哪個質數因子有關!
舉個栗子:
例題:正整數\(360\)的所有正約數的和是多少?
解:將\(360\)分解質因數可得
\(360=2^3*3^2*5^1\)
由約數和定理可知,\(360\)所有正約數的和為
\((2^0+2^1+2^2+2^3)×(3^0+3^1+3^2)×(5^0+5^1)=(1+2+4+8)×(1+3+9)×(1+5)=15×13×6=1170\)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 110;
const int mod = 1e9 + 7;
int main() {
int n;
cin >> n;
unordered_map<int, int> primes;
while (n--) {
int x;
cin >> x;
for (int i = 2; i <= x / i; i++)
while (x % i == 0) {
x /= i;
primes[i]++;
}
if (x > 1) primes[x]++;
}
LL res = 1;
for (auto p : primes) {
LL a = p.first, b = p.second;
LL t = 1;
while (b--) t = (t * a + 1) % mod;
res = res * t % mod;
}
cout << res << endl;
return 0;
}