算数基本定理的推论
N的正约数集合:
{
p
1
b
1
p_1^{b1}
p1b1
p
2
b
2
p_2^{b2}
p2b2…
p
m
b
m
p_m^{bm}
pmbm},其中0<=bi<=ci
N的正约术个数为:
(
c
1
+
1
)
∗
(
c
2
+
1
)
∗
.
.
.
∗
(
c
m
+
1
)
=
∏
i
=
1
m
(
c
i
+
1
)
(c_1+1)*(c_2+1)*...*(c_m+1) = \prod_{i=1}^{m}(c_i+1)
(c1+1)∗(c2+1)∗...∗(cm+1)=i=1∏m(ci+1)
N的所有正约数的和为:
(
1
+
p
1
+
p
1
2
+
.
.
.
+
p
1
c
1
)
∗
.
.
.
∗
(
1
+
p
m
+
p
m
2
+
.
.
.
p
m
c
m
)
=
∏
i
=
1
m
(
∑
j
=
0
c
i
(
p
i
)
j
)
(1+p_1+p_1^2+...+p_1^{c_1})*...*(1+p_m+p_m^2+...p_m^{c_m}) = \prod_{i=1}^{m}(\sum_{j=0}^{c_i}(p_i)^j)
(1+p1+p12+...+p1c1)∗...∗(1+pm+pm2+...pmcm)=i=1∏m(j=0∑ci(pi)j)
求N的正约数集合
试除法
int factor[1600], m = 0;
void func(int n) {
for (int i = 1; i * i <= n; i++) {
if (n % i == 0) {
factor[++m] = i;
if (i != n / i)factor[++m] = n / i;
}
}
for (int i = 1; i <= m; i++)
cout << factor[i] << endl;
}
推论:
一个整数N的约数个数上界为2
N
\sqrt{N}
N。
求1~N每个数的正约数集合
倍数法
vector<int>factor[500010];
void func(int n) {
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n / i; j++)
factor[i * j].push_back(i);
for (int i = 1; i <= n; i++) {
for (int j = 0; j < factor[i].size(); j++)
cout << factor[i][j] << " ";
cout << endl;
}
}
例题
AcWing198
AcWing199
最大公约数
欧几里得算法
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
互质与欧拉函数
互质的定义:
gcd(a,b)=1,a与b互质
欧拉函数
φ ( N ) = N ∗ p 1 − 1 p 1 ∗ p 2 − 1 p 2 ∗ . . . ∗ p m − 1 p m = N ∗ ∏ 质 数 p ∣ N ( 1 − 1 p ) \varphi{(N)} = N*\frac{p_1-1}{p_1}*\frac{p_2-1}{p_2}*...*\frac{p_m-1}{p_m} = N*\prod_{质数p|N}(1-\frac{1}{p}) φ(N)=N∗p1p1−1∗p2p2−1∗...∗pmpm−1=N∗质数p∣N∏(1−p1)
int phi(int n) {
int ans = n;
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
ans = ans / i * (i - 1);
while (n % i == 0)n /= i;
}
}
if (n > 1)ans = ans / n * (n - 1);
return ans;
}
性质1~2
1.
∀
\forall
∀n>1,1~n中与n互质的数的和为n*
φ
(
n
)
\varphi(n)
φ(n)/2。
2.若a,b互质,则
φ
(
a
b
)
=
φ
(
a
)
φ
(
b
)
\varphi(ab)=\varphi(a)\varphi(b)
φ(ab)=φ(a)φ(b)
积性函数
如果当a,b互质时,有f(a,b)=f(a)*f(b),那么f为积性函数
性质3~6
3.若f是积性函数,且在算术基本定理中
f
(
n
)
=
∏
i
=
1
m
p
i
c
i
f(n)=\prod_{i=1}^{m}p_i^{c_i}
f(n)=i=1∏mpici
4.设p为质数,若p|n且
p
2
∣
n
p^2|n
p2∣n,则
φ
(
n
)
=
φ
(
n
/
p
)
∗
p
\varphi(n)=\varphi(n/p)*p
φ(n)=φ(n/p)∗p
5.设p为质数,若p|n且
p
2
∤
n
p^2\nmid n
p2∤n,则
φ
(
n
)
=
φ
(
n
/
p
)
∗
(
p
−
1
)
\varphi(n)=\varphi(n/p)*(p-1)
φ(n)=φ(n/p)∗(p−1)
6.
∑
d
∣
n
φ
(
d
)
=
n
\sum_{d|n}\varphi(d)=n
d∣n∑φ(d)=n
例题:
AcWing201
可见的点
void euler(int n) {
for (int i = 2; i <= n; i++) phi[i] = i;
for (int i = 2; i <= n; i++)
if (phi[i] == i)
for (int j = i; j <= n; j += i)
phi[i] = phi[i] / i * (i - 1);
}