定义:
若函数 f ( x ) f(x) f(x) 满足 ∀ gcd ( a , b ) = 1 , f ( a b ) = f ( a ) f ( b ) \forall \gcd(a,b)=1, f(ab)=f(a)f(b) ∀gcd(a,b)=1,f(ab)=f(a)f(b),则函数 f f f 为积性函数。
函数:
-
莫比乌斯函数 μ ( x ) \mu(x) μ(x) 为积性函数
证明:令 a = p 1 α 1 p 2 α 2 … p k α k a=p_1^{\alpha_1}p_2^{\alpha_2}\dots p_k^{\alpha_k} a=p1α1p2α2…pkαk, b = q 1 β 1 q 2 β 2 … q t β t b=q_1^{\beta_1}q_2^{\beta_2}\dots q_t^{\beta_t} b=q1β1q2β2…qtβt
则若 ∃ i , α i ≥ 2 \exist i,\alpha_i\ge 2 ∃i,αi≥2 或 ∃ i , β i ≥ 2 \exist i,\beta_i\ge 2 ∃i,βi≥2,那么 μ ( a ) μ ( b ) = 0 \mu(a)\mu(b)=0 μ(a)μ(b)=0,而 a b ab ab 中也一定存在某个质因子的次数大于等于 2 2 2,所以 μ ( a b ) = 0 \mu(ab)=0 μ(ab)=0,故该情况成立。
反之,若 ∀ i ∈ [ 1 , k ] , j ∈ [ 1 , t ] , α i = 1 , β j = 1 \forall i\in[1,k],j\in [1,t],\alpha_i=1,\beta_j=1 ∀i∈[1,k],j∈[1,t],αi=1,βj=1,则 μ ( a ) = ( − 1 ) k , μ ( b ) = ( − 1 ) t \mu(a)=(-1)^{k},\mu(b)=(-1)^t μ(a)=(−1)k,μ(b)=(−1)t, a b = p 1 p 2 … p k q 1 … q t ab=p_1p_2\dots p_kq_1\dots q_t ab=p1p2…pkq1…qt,所以 μ ( a b ) = ( − 1 ) k + t = ( − 1 ) k ( − 1 ) t = μ ( a ) μ ( b ) \mu(ab)=(-1)^{k+t}=(-1)^k(-1)^t=\mu(a)\mu(b) μ(ab)=(−1)k+t=(−1)k(−1)t=μ(a)μ(b)
综上所述, μ ( x ) \mu(x) μ(x) 为积性函数。
-
欧拉函数 φ ( x ) \varphi (x) φ(x) 为积性函数
证明: φ ( a ) = a ∏ i = 1 k p i − 1 p i , φ ( b ) = b ∏ i = 1 t q i − 1 q i , φ ( a b ) = a b ∏ i = 1 k p i − 1 p i ∏ i = 1 t q i − 1 q i \varphi(a)=a\prod_{i=1}^k\frac{p_i-1}{p_i},\varphi(b)=b\prod_{i=1}^t\frac{q_i-1}{q_i},\varphi(ab)=ab\prod_{i=1}^k\frac{p_i-1}{p_i}\prod_{i=1}^t\frac{q_i-1}{q_i} φ(a)=a∏i=1kpipi−1,φ(b)=b∏i=1tqiqi−1,φ(ab)=ab∏i=1kpipi−1∏i=1tqiqi−1
为什么 a b ab ab 的分解质因数为: p 1 p 2 … p k q 1 q 2 … q t p_1p_2\dots p_kq_1q_2\dots q_t p1p2…pkq1q2…qt 呢?为什么不会 ∃ i , j , p i = q j \exist i,j ,p_i=q_j ∃i,j,pi=qj 呢?——答:因为 a a a 和 b b b 互质。
所以 φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab)=\varphi(a)\varphi(b) φ(ab)=φ(a)φ(b)
-
最大公因数 gcd ( x , n ) \gcd(x,n) gcd(x,n) 当 n n n 固定的情况下,为积性函数
证明:
n = p 1 α 1 p 2 α 2 … p k α k , a b = p 1 β 1 p 2 β 2 … p k β k n=p_1^{\alpha_1}p_2^{\alpha_2}\dots p_k^{\alpha_k},ab=p_1^{\beta_1}p_2^{\beta_2}\dots p_k^{\beta_k} n=p1α1p2α2…pkαk,ab=p1β1p2β2…pkβk
{ a = p 1 θ 1 p 2 θ 2 … p k θ k b = p 1 β 1 − θ 1 p 2 β 2 − θ 2 … p k β k − θ k \begin{cases} &a=p_1^{\theta_1}p_2^{\theta_2}\dots p_k^{\theta_k}\\ &b=p_1^{\beta_1-\theta_1}p_2^{\beta_2-\theta_2}\dots p_k^{\beta_k-\theta_k} \end{cases} {a=p1θ1p2θ2…pkθkb=p1β1−θ1p2β2−θ2…pkβk−θkgcd ( a , n ) = p 1 min ( θ 1 , α 1 ) p 2 min ( θ 2 , α 2 ) … p k min ( θ k , α k ) , gcd ( b , n ) = p 1 min ( β 1 − θ 1 , α 1 ) p 2 min ( β 2 − θ 2 , α 2 ) … p k min ( β k − θ k , α k ) \gcd(a,n)=p_1^{\min(\theta_1, \alpha_1)}p_2^{\min(\theta_2, \alpha_2)}\dots p_k^{\min(\theta_k, \alpha_k)},\gcd(b,n)=p_1^{\min(\beta_1-\theta_1, \alpha_1)}p_2^{\min(\beta_2-\theta_2, \alpha_2)}\dots p_k^{\min(\beta_k-\theta_k, \alpha_k)} gcd(a,n)=p1min(θ1,α1)p2min(θ2,α2)…pkmin(θk,αk),gcd(b,n)=p1min(β1−θ1,α1)p2min(β2−θ2,α2)…pkmin(βk−θk,αk)
由于 a a a 和 b b b 互质,所以必定不存在某个质因子相同,故 ∀ i , θ i = 0 o r θ i = β i \forall i,\theta_i=0\ \mathrm{or}\ \theta_i=\beta_i ∀i,θi=0 or θi=βi。
则: gcd ( a , n ) gcd ( b , n ) = p 1 min ( α 1 , β 1 ) p 2 min ( α 2 , β 2 ) … p k min ( α k , β k ) = gcd ( a b , n ) \gcd(a,n)\gcd(b,n)=p_1^{\min(\alpha_1,\beta_1)}p_2^{\min(\alpha_2,\beta_2)}\dots p_k^{\min(\alpha_k,\beta_k)}=\gcd(ab,n) gcd(a,n)gcd(b,n)=p1min(α1,β1)p2min(α2,β2)…pkmin(αk,βk)=gcd(ab,n)
-
x x x 的正因子的数量 d ( x ) d(x) d(x) 为积性函数
证明:与欧拉函数比较类似,略。
-
x x x 的正因子之和 σ ( x ) \sigma (x) σ(x) 为积性函数
证明:
若 a = p 1 α 1 p 2 α 2 … p k α k , b = q 1 α 1 q 2 α 2 … q t α t a=p_1^{\alpha_1}p_2^{\alpha_2}\dots p_k^{\alpha_k},b=q_1^{\alpha_1}q_2^{\alpha_2}\dots q_t^{\alpha_t} a=p1α1p2α2…pkαk,b=q1α1q2α2…qtαt,
则:
σ ( a ) = ∏ j = 1 k ∑ i = 0 α j p j i , σ ( b ) = ∏ j = 1 t ∑ i = 0 β j q j i , σ ( a b ) = ∏ j = 1 k ∑ i = 0 α j p j i ∏ j = 1 t ∑ i = 0 β j q j i \sigma(a)=\prod_{j=1}^k\sum_{i=0}^{\alpha_j}{p_j}^i,\sigma(b)=\prod_{j=1}^t\sum_{i=0}^{\beta_j}{q_j}^i,\sigma(ab)=\prod_{j=1}^k\sum_{i=0}^{\alpha_j}{p_j}^i\prod_{j=1}^t\sum_{i=0}^{\beta_j}{q_j}^i σ(a)=j=1∏ki=0∑αjpji,σ(b)=j=1∏ti=0∑βjqji,σ(ab)=j=1∏ki=0∑αjpjij=1∏ti=0∑βjqji
注:可以考虑去括号进行理解,每次其实就是在 k k k 个是式子里每一个选择一个质因数的次数。所以, σ ( a b ) = σ ( a ) σ ( b ) \sigma(ab)=\sigma(a)\sigma(b) σ(ab)=σ(a)σ(b)
例题精讲:
给定一个整数 n n n,你需要求出 ∑ i = 1 n gcd ( i , n ) \sum\limits_{i=1}^n \gcd(i, n) i=1∑ngcd(i,n), 1 ≤ n < 2 32 1\leq n< 2^{32} 1≤n<232
考虑令
d
=
gcd
(
i
,
n
)
d=\gcd(i,n)
d=gcd(i,n),然后枚举
d
d
d,那么
d
d
d 能作为
i
i
i 和
n
n
n 的最大公约数当且仅当
gcd
(
i
d
,
n
d
)
=
1
\gcd(\frac{i}{d},\frac{n}{d})=1
gcd(di,dn)=1
∑
i
=
1
n
gcd
(
i
,
n
)
=
∑
d
∣
n
d
∑
d
∣
i
[
gcd
(
i
d
,
n
d
)
=
1
]
=
∑
d
∣
n
d
∑
i
=
1
n
d
[
gcd
(
i
,
n
d
)
=
1
]
←
注意:这里的
i
与上式的
i
不同
=
∑
d
∣
n
d
φ
(
n
d
)
\begin{aligned} &\sum_{i=1}^n\gcd(i,n)\\ =&\sum_{d|n}d\sum_{d|i}[\gcd(\frac{i}{d},\frac{n}{d})=1]\\ =&\sum_{d|n}d\sum_{i=1}^{\frac{n}{d}}[\gcd(i,\frac{n}{d})=1]\leftarrow 注意:这里的\ i\ 与上式的\ i\ 不同\\ =&\sum_{d|n}d\varphi(\frac{n}{d}) \end{aligned}
===i=1∑ngcd(i,n)d∣n∑dd∣i∑[gcd(di,dn)=1]d∣n∑di=1∑dn[gcd(i,dn)=1]←注意:这里的 i 与上式的 i 不同d∣n∑dφ(dn)
这时候,时间复杂度为
O
(
n
d
(
n
)
)
O(\sqrt n d(n))
O(nd(n)),
d
(
n
)
d(n)
d(n) 表示为
n
n
n 的约数,已经可以通过本题。
不过,可以做到更好!
∑
d
∣
n
d
φ
(
n
d
)
=
∑
d
∣
n
n
d
φ
(
d
)
←
注意这里的
d
为上式的
n
d
=
∑
d
∣
n
n
d
d
∏
i
=
1
k
p
i
−
1
p
i
=
∑
d
∣
n
n
∏
i
=
1
k
p
i
−
1
p
i
\begin{aligned} &\sum_{d|n}d\varphi(\frac{n}{d})\\ =&\sum_{d|n}\frac{n}{d}\varphi(d)\leftarrow 注意这里的\ d\ 为上式的 \frac{n}{d}\\ =&\sum_{d|n}\frac{n}{d}d\prod_{i=1}^k \frac{p_i-1}{p_i}\\ =&\sum_{d|n}n\prod_{i=1}^k \frac{p_i-1}{p_i}\\ \end{aligned}
===d∣n∑dφ(dn)d∣n∑dnφ(d)←注意这里的 d 为上式的dnd∣n∑dndi=1∏kpipi−1d∣n∑ni=1∏kpipi−1
这时候,借鉴一下证明正因子之和为积性函数的思路,可以化简为若干个多项式的乘积:
∏
i
=
1
k
(
1
+
p
i
−
1
p
i
+
⋯
+
p
i
−
1
p
i
⏟
α
i
)
\prod_{i=1}^k(1+\underbrace{\frac{p_i-1}{p_i}+\dots +\frac{p_i-1}{p_i}}_{\alpha_i})
i=1∏k(1+αi
pipi−1+⋯+pipi−1)
其中
p
p
p 与
α
\alpha
α 为
n
=
∏
i
=
1
k
p
i
α
i
n=\prod_{i=1}^k {p_i}^{\alpha_i}
n=∏i=1kpiαi,式子的含义就是对于每一个约数
d
d
d,当前
p
i
p_i
pi 不选则对答案的贡献为
1
1
1,反之为
p
i
−
1
p
i
\frac{p_i-1}{p_i}
pipi−1。
所以,最终的答案为(不要忘记乘式子前面的
n
n
n):
n
∏
i
=
1
k
(
1
+
p
i
−
1
p
i
α
i
)
n\prod_{i=1}^k(1+\frac{p_i-1}{p_i}\alpha_i)
ni=1∏k(1+pipi−1αi)
时间复杂度:
O
(
n
)
O(\sqrt n)
O(n)
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
int n;
signed main() {
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> n;
int res = n;
for (int i = 2; i <= n / i; i ++)
if (n % i == 0) {
int cnt = 0;
while (n % i == 0) cnt ++, n /= i;
res = res / i * (i + (i - 1) * cnt);
}
if (n > 1) res = res / n * (2 * n - 1);
cout << res << endl;
return 0;
}