狄利克雷卷积相关
一、数论函数
数论函数是指定义在整数集上,陪域是实数或复数的函数。 数论函数又称为算术函数。
像 σ ( n ) \sigma(n) σ(n),表示 n n n的约数之和的函数,就是一个数论函数;
像 i d ( n ) = n id(n)=n id(n)=n,表示 n n n本身,也是数论函数。
它们的定义域都是整数。
二、积性函数
1、积性函数的定义
积性函数是指满足下列条件的一类数论函数。设函数为 f f f, 设 a , b a,b a,b是任意两个互质的整数。
如果满足 f ( a ) × f ( b ) = f ( a × b ) f(a) \times f(b) = f(a\times b) f(a)×f(b)=f(a×b), 则函数 f f f为积性函数。
如果不要求 a , b a,b a,b互质,仍然满足 f ( a ) × f ( b ) = f ( a × b ) f(a) \times f(b) = f(a \times b) f(a)×f(b)=f(a×b),则称 f f f为完全积性函数。
许多函数都是积性函数。
2、常见的积性函数
常见的积性函数有:
单位函数: ϵ ( n ) = [ n = 1 ] \epsilon(n) = [n = 1] ϵ(n)=[n=1] (方括号是艾佛森表示法,类似于一个条件表达式,当方括号中的条件成立时返回 1 1 1;否则返回 0 0 0)
常数函数: I ( n ) = 1 I(n) = 1 I(n)=1
恒等函数: I d ( n ) = n Id(n) = n Id(n)=n
幂函数: I d k ( n ) = n k Id_k(n) = n^k Idk(n)=nk
恒等函数可以看做 k = 1 k=1 k=1的幂函数,常数函数可以看做 k = 0 k=0 k=0的幂函数。
约数函数: σ ( n ) = ∑ d ∣ n d \sigma(n) = \sum_{d|n}d σ(n)=∑d∣nd
约数个数函数: σ 0 ( n ) = ∑ d ∣ n d 0 \sigma_0(n)=\sum_{d|n}d^0 σ0(n)=∑d∣nd0
欧拉函数: ϕ ( n ) = ∑ a ≤ n [ ( a , n ) = 1 ] \phi(n)=\sum_{a\leq n}[(a,n)=1] ϕ(n)=∑a≤n[(a,n)=1]
莫比乌斯函数: μ ( n ) = { 1 n = 1 ( − 1 ) k n = p 1 … p k 0 p 2 ∣ n \mu(n) = \begin{cases} 1 &n=1 \\ (-1)^k &n=p_1\dots p_k \\0 &p^2|n \end{cases} μ(n)=⎩ ⎨ ⎧1(−1)k0n=1n=p1…pkp2∣n
其中 I ( n ) , I d ( n ) , I d k ( n ) I(n), Id(n), Id_k(n) I(n),Id(n),Idk(n)为完全积性函数。
3、证明欧拉函数为积性函数
如何证明欧拉函数是积性函数?即设 a , b a,b a,b互质, ϕ ( a b ) = ϕ ( a ) ∗ ϕ ( b ) \phi(ab) = \phi(a) *\phi(b) ϕ(ab)=ϕ(a)∗ϕ(b)
证明:设 x x x与 a b ab ab互质,且 x < a b x \lt ab x<ab。则 x x x一定同时与 a a a和 b b b互质,设 p = x % a , q = x % b p = x \% a, q = x \%b p=x%a,q=x%b,显然有 p ∈ Z a ∗ , q ∈ Z b ∗ p \in Z_a^*,q \in Z_b^* p∈Za∗,q∈Zb∗,其中 Z a ∗ , Z b ∗ Z_a^*,Z_b^* Za∗,Zb∗分别表示 a , b a,b a,b的简化剩余系。
{
x
≡
p
(
m
o
d
a
)
x
≡
q
(
m
o
d
b
)
\begin{cases} x \equiv p \pmod{a} \\ x \equiv q \pmod {b} \end{cases}
{x≡p(moda)x≡q(modb)
则以上方程的解
x
x
x的个数就是
ϕ
(
a
b
)
\phi(ab)
ϕ(ab)。对于任意的
p
∈
Z
a
∗
,
q
∈
Z
b
∗
p \in Z_a^*, q \in Z_b^*
p∈Za∗,q∈Zb∗,根据中国剩余定理,在
[
0
,
a
b
−
1
]
[0, ab-1]
[0,ab−1]内都存在一组解。而满足条件的
p
,
q
p,q
p,q对刚好有
ϕ
(
a
)
×
ϕ
(
b
)
\phi(a) \times \phi(b)
ϕ(a)×ϕ(b),所以
ϕ
(
a
b
)
=
ϕ
(
a
)
×
ϕ
(
b
)
\phi(ab) = \phi(a) \times \phi(b)
ϕ(ab)=ϕ(a)×ϕ(b)。
得证。
4、积性函数的性质
(1)、积性函数的乘积仍然是积性函数。
简单证明一下:
设
H
,
G
H,G
H,G为积性函数,
F
=
H
×
G
F=H \times G
F=H×G,
a
,
b
a,b
a,b互质。
F
(
a
×
b
)
=
H
(
a
×
b
)
×
G
(
a
×
b
)
=
H
(
a
)
×
H
(
b
)
×
G
(
a
)
×
G
(
b
)
=
(
H
(
a
)
×
G
(
a
)
)
×
(
H
(
b
)
×
G
(
b
)
)
=
F
(
a
)
×
F
(
b
)
F(a\times b)=H(a \times b) \times G(a \times b)=H(a) \times H(b) \times G(a) \times G(b) = (H(a) \times G(a)) \times (H(b) \times G(b)) = F(a) \times F(b)
F(a×b)=H(a×b)×G(a×b)=H(a)×H(b)×G(a)×G(b)=(H(a)×G(a))×(H(b)×G(b))=F(a)×F(b)
(2)、积性函数的狄利克雷卷积仍然是积性函数。
简单证明一下:
设
H
,
G
H,G
H,G为积性函数,
F
=
H
×
G
,
a
,
b
F=H \times G, a, b
F=H×G,a,b为互质的正整数。
F
(
a
×
b
)
=
∑
d
∣
(
a
b
)
H
(
d
)
×
G
(
a
b
d
)
=
∑
(
d
1
∣
a
,
d
2
∣
b
)
H
(
d
1
)
H
(
d
2
)
G
(
a
/
d
1
)
G
(
b
/
d
2
)
=
∑
d
1
∣
a
H
(
d
1
)
G
(
a
/
d
1
)
∑
d
2
∣
b
H
(
d
2
)
G
(
b
/
d
2
)
=
F
(
a
)
×
F
(
b
)
\begin{aligned} F(a \times b) &= \sum_{d|(ab)}H(d)\times G(\frac{ab}{d}) = \sum_{(d_1|a,d_2|b)} H(d_1)H(d_2)G(a/d_1)G(b/d_2) \\ &=\sum_{d_1|a}H(d_1)G(a/d_1)\sum_{d_2|b}H(d_2)G(b/d_2)=F(a)\times F(b) \end{aligned}
F(a×b)=d∣(ab)∑H(d)×G(dab)=(d1∣a,d2∣b)∑H(d1)H(d2)G(a/d1)G(b/d2)=d1∣a∑H(d1)G(a/d1)d2∣b∑H(d2)G(b/d2)=F(a)×F(b)
积性函数都可以采用欧拉筛求值。
f
(
n
)
=
f
(
p
1
a
1
p
2
a
2
…
p
k
a
k
)
=
f
(
p
1
a
1
)
∗
f
(
p
2
a
2
)
…
f
(
p
k
a
k
)
f(n) = f(p_1^{a_1}p_2^{a_2} \dots p_k^{a_k})=f(p_1^{a_1})*f(p_2^{a_2}) \dots f(p_k^{a_k})
f(n)=f(p1a1p2a2…pkak)=f(p1a1)∗f(p2a2)…f(pkak)
其中
p
1
,
p
2
,
…
,
p
k
p_1,p_2,\dots,p_k
p1,p2,…,pk表示
n
n
n的不同质因子。
三、莫比乌斯反演
1. 莫比乌斯函数
μ ( n ) = { 1 n = 1 ( − 1 ) k n = p 1 … p k 0 p 2 ∣ n \mu(n) = \begin{cases} 1 &n=1 \\ (-1)^k &n=p_1\dots p_k \\0 &p^2|n \end{cases} μ(n)=⎩ ⎨ ⎧1(−1)k0n=1n=p1…pkp2∣n
p 2 ∣ n p^2|n p2∣n表示 n n n存在一个平方因子。
莫比乌斯函数的性质
∑ d ∣ n μ ( d ) = [ n = 1 ] \begin{aligned} \sum_{d|n}\mu(d) = [n = 1] \end{aligned} d∣n∑μ(d)=[n=1]
证明:
当 d = 1 d=1 d=1时, μ ( 1 ) = 1 \mu(1)=1 μ(1)=1;
其他情况下,只有当 d d d的质因子都只出现一次,假设此时 d d d的质因子种类为 k k k, 则 μ ( d ) = ( − 1 ) k \mu(d)=(-1)^k μ(d)=(−1)k。
d d d中出现的质因子,必定是 n n n的质因子,所以,问题变成从 n n n的所有质因子中选择若干,选奇数个则贡献 − 1 -1 −1, 选偶数个则贡献 1 1 1.
设 n n n中一共有 m m m类质因子, ∑ d ∣ n μ ( d ) = ∑ ( − 1 ) j ( m j ) = ( 1 − 1 ) m \begin{aligned} \sum_{d|n}\mu(d) = \sum(-1)^j\binom{m}{j}=(1-1)^m \end{aligned} d∣n∑μ(d)=∑(−1)j(jm)=(1−1)m
以上是根据二项式定理: ( x + y ) n = ∑ i = 0 n ( n i ) x i y n − i \begin{aligned} (x+y)^n=\sum\limits_{i=0}^n\binom{n}{i}x^iy^{n-i} \end{aligned} (x+y)n=i=0∑n(in)xiyn−i
当 m > 0 m>0 m>0时, ∑ d ∣ n μ ( d ) = 0 \sum\limits_{d|n}\mu(d) = 0 d∣n∑μ(d)=0;
当 m = 0 m=0 m=0时, ∑ d ∣ n μ ( d ) = 1 \sum\limits_{d|n}\mu(d) = 1 d∣n∑μ(d)=1。
2. 莫比乌斯反演
(1). 公式1:
若 F ( n ) = ∑ d ∣ n f ( d ) F(n)=\sum_{d|n}f(d) F(n)=∑d∣nf(d), 则有 f ( n ) = ∑ d ∣ n μ ( d ) F ( n d ) f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d}) f(n)=∑d∣nμ(d)F(dn)
证明:
f ( n ) = ∑ d ∣ n μ ( d ) F ( n / d ) = ∑ d ∣ n μ ( d ) ∑ p ∣ ( n / d ) f ( p ) = ∑ p ∣ n f ( p ) ∑ d ∣ ( n / p ) μ ( d ) \begin{aligned}f(n)=\sum_{d|n}\mu(d)F(n/d)=\sum_{d|n}\mu(d)\sum_{p|(n/d)}f(p)=\sum_{p|n}f(p)\sum_{d|(n/p)}\mu(d)\end{aligned} f(n)=d∣n∑μ(d)F(n/d)=d∣n∑μ(d)p∣(n/d)∑f(p)=p∣n∑f(p)d∣(n/p)∑μ(d)
根据莫比乌斯函数的性质,可知只有当 n / p = 1 n/p=1 n/p=1时, ∑ d ∣ ( n / p ) μ ( d ) = 1 \sum_{d|(n/p)}\mu(d)=1 ∑d∣(n/p)μ(d)=1,其他情况下都为 0 0 0.
所以,
∑ p ∣ n f ( p ) ∑ d ∣ ( n / p ) μ ( d ) = f ( n ) \begin{aligned}\sum_{p|n}f(p) \sum_{d|(n/p)}\mu(d) = f(n) \end{aligned} p∣n∑f(p)d∣(n/p)∑μ(d)=f(n)
得证!
(2). 公式2:
若 F ( n ) = ∑ n ∣ d f ( d ) F(n) = \sum_{n|d}f(d) F(n)=∑n∣df(d), 则有 f ( n ) = ∑ n ∣ d μ ( d / n ) F ( d ) f(n)=\sum_{n|d}\mu(d/n)F(d) f(n)=∑n∣dμ(d/n)F(d)
证明:
f ( n ) = ∑ n ∣ d μ ( d / n ) F ( d ) = ∑ n ∣ d μ ( d / n ) ∑ d ∣ p f ( p ) = ∑ n ∣ p f ( p ) ∑ d ∣ ( p / n ) μ ( d ) = f ( n ) \begin{aligned} f(n)=\sum_{n|d}\mu(d/n)F(d)=\sum_{n|d}\mu(d/n)\sum_{d|p}f(p)= \sum_{n|p}f(p)\sum_{d|(p/n)}\mu(d) = f(n)\end{aligned} f(n)=n∣d∑μ(d/n)F(d)=n∣d∑μ(d/n)d∣p∑f(p)=n∣p∑f(p)d∣(p/n)∑μ(d)=f(n)
3. 一些有趣的性质:
-
当 n > 1 n>1 n>1时, ∑ i < n ( i × [ g c d ( i , n ) = 1 ] ) = n ϕ ( n ) 2 \sum\limits_{i \lt n} (i \times [gcd(i,n)=1]) = \frac{n \phi(n)}{2} i<n∑(i×[gcd(i,n)=1])=2nϕ(n)
解释:当 n > 1 n>1 n>1时, n n n的简化剩余系中,元素都是成对出现的,每一对元素的和为 n n n. -
ϕ ( n ) = ∑ i ∣ d μ ( i ) ∗ ( n / i ) \phi(n)=\sum_{i|d}\mu(i)*(n/i) ϕ(n)=∑i∣dμ(i)∗(n/i)
解释:根据容斥原理,与 n n n互质的数,其个数为:(与 n n n的公约数为 1 1 1的数的个数)-(与 n n n的公约数由一类质因子组成的数的个数)+(与 n n n的公约数由两类质因子组成的数的个数)- (与 n n n的公约数由三类质因子组成的数的个数)+ … \dots … - (与 n n n的公约数由奇数类质因子组成的数的个数) + (与 n n n的公约数由偶数类质因子组成的数的个数)。 -
n = ∑ i ∣ d ϕ ( i ) n= \sum_{i|d}\phi(i) n=∑i∣dϕ(i)
解释:
小于等于 n n n的整数共有 n n n个,可以分类统计:与 n n n的最大公约数为 i i i的数有 ϕ ( n / i ) \phi(n/i) ϕ(n/i)个。于是有 n = ∑ i ∣ d ϕ ( n / i ) = ∑ i ∣ d ϕ ( i ) n = \sum_{i |d} \phi(n/i) = \sum_{i|d} \phi(i) n=∑i∣dϕ(n/i)=∑i∣dϕ(i) -
扩展欧拉定理: a b % p = a ( b % ϕ ( p ) + ϕ ( p ) ) % p a^b\%p=a^{(b\%\phi(p)+\phi(p))}\%p ab%p=a(b%ϕ(p)+ϕ(p))%p ,此处不要求 a , p a,p a,p互质。
解释:参考另一篇待写的博客。
4. 莫比乌斯反演的应用
(1). 例1:证明下式成立
∑ d ∣ n μ ( d ) ( n d ) = ϕ ( n ) \begin{aligned} \sum\limits_{d|n}\mu(d)(\frac{n}{d})=\phi(n) \end{aligned} d∣n∑μ(d)(dn)=ϕ(n)
证明:
∵ n = ∑ d ∣ n ϕ ( n / d ) = ∑ d ∣ n ϕ ( d ) \because n=\sum_{d|n}\phi(n/d) =\sum_{d|n}\phi(d) ∵n=∑d∣nϕ(n/d)=∑d∣nϕ(d),
设 F ( n ) = n F(n)=n F(n)=n, f ( n ) = ϕ ( d ) f(n)=\phi(d) f(n)=ϕ(d),
则上式为 F ( n ) = ∑ d ∣ n f ( d ) F(n)=\sum_{d|n}f(d) F(n)=∑d∣nf(d), 利用莫比乌斯反演公式1, 可得:
f ( n ) = ∑ d ∣ n μ ( d ) F ( n / d ) \begin{aligned} f(n)=\sum_{d|n}\mu(d)F(n/d) \end{aligned} f(n)=d∣n∑μ(d)F(n/d)
即:
ϕ ( n ) = ∑ d ∣ n μ ( d ) ( n / d ) \begin{aligned} \phi(n)=\sum_{d|n}\mu(d)(n/d) \end{aligned} ϕ(n)=d∣n∑μ(d)(n/d)
(2). BZOJ2301 problem B
题目描述
对于给出的n个询问,每次求有多少个数对 ( x , y ) (x,y) (x,y),满足 a ≤ x ≤ b a≤x≤b a≤x≤b, c ≤ y ≤ d c≤y≤d c≤y≤d,且 g c d ( x , y ) = k gcd(x,y) = k gcd(x,y)=k, g c d ( x , y ) gcd(x,y) gcd(x,y)函数为x和y的最大公约数。
输入格式
第一行一个整数 n n n,接下来 n n n行每行五个整数,分别表示 a 、 b 、 c 、 d 、 k a、b、c、d、k a、b、c、d、k
输出格式
共 n n n行,每行一个整数表示满足要求的数对 ( x , y ) (x,y) (x,y)的个数
数据规模
n ≤ 50000 , 1 ≤ a ≤ b ≤ 50000 , 1 ≤ c ≤ d ≤ 50000 n\leq 50000, 1 \leq a \leq b \leq 50000, 1 \leq c \leq d \leq 50000 n≤50000,1≤a≤b≤50000,1≤c≤d≤50000
分析
设 f ( k ) f(k) f(k)为 ∑ x = a b ∑ y = c d [ g c d ( x , y ) = k ] \sum_{x=a}^b\sum_{y=c}^d[gcd(x,y)=k] ∑x=ab∑y=cd[gcd(x,y)=k], F ( k ) F(k) F(k)为 ∑ x = a b ∑ y = c d [ k ∣ g c d ( x , y ) ] \sum_{x=a}^b\sum_{y=c}^d[k|gcd(x,y)] ∑x=ab∑y=cd[k∣gcd(x,y)],
则有 F ( k ) = ∑ k ∣ n f ( n ) F(k)=\sum_{k|n}f(n) F(k)=∑k∣nf(n)
而 F ( k ) F(k) F(k)是很好求的,它为: ( ⌊ b / k ⌋ − ⌊ ( a − 1 ) / k ⌋ ) ∗ ( ⌊ d / k ⌋ − ⌊ ( c − 1 ) / k ⌋ ) (\lfloor b/k \rfloor - \lfloor (a-1)/k \rfloor)*(\lfloor d/k \rfloor - \lfloor (c-1)/k\rfloor) (⌊b/k⌋−⌊(a−1)/k⌋)∗(⌊d/k⌋−⌊(c−1)/k⌋).
应用莫比乌斯反演:
可知
f ( k ) = ∑ k ∣ n μ ( n / k ) ∗ F ( n ) = ∑ k ∣ n μ ( n / k ) ∗ ( ⌊ b / n ⌋ − ⌊ ( a − 1 ) / n ⌋ ) ∗ ( ⌊ d / n ⌋ − ⌊ ( c − 1 ) / n ⌋ ) \begin{aligned} f(k) = \sum_{k|n} \mu(n/k)*F(n) = \sum_{k|n}\mu(n/k)*(\lfloor b/n \rfloor - \lfloor (a-1)/n \rfloor)*(\lfloor d/n \rfloor - \lfloor (c-1)/n\rfloor) \end{aligned} f(k)=k∣n∑μ(n/k)∗F(n)=k∣n∑μ(n/k)∗(⌊b/n⌋−⌊(a−1)/n⌋)∗(⌊d/n⌋−⌊(c−1)/n⌋)
注意 a , b , c , d a, b, c, d a,b,c,d为常数, ⌊ a / n ⌋ \lfloor a/n \rfloor ⌊a/n⌋随着 n n n增加而变化,但 ⌊ a / n ⌋ \lfloor a/n \rfloor ⌊a/n⌋的取值最多只有 2 a 2\sqrt{a} 2a个。
为什么呢?
如下图所示,为 f ( n ) = 1 / n ( n > 0 ) f(n) = 1/n (n>0) f(n)=1/n(n>0)的曲线图像,它是一条以 y = x y=x y=x对称的曲线。这很好理解。
若 ( x , y ) (x,y) (x,y)在曲线上,则 ( y , x ) (y,x) (y,x)也必在曲线上。
对 f ( x ) = a / x f(x)=a/x f(x)=a/x而言,曲线对称的中心点在 ( a , a ) (\sqrt{a},\sqrt{a}) (a,a)处,在中心点左边, x x x最多 a \sqrt{a} a个整数取值,因为对称,所以在 ( a , a ) (\sqrt{a},\sqrt{a}) (a,a)的右边, y y y值最多 a \sqrt{a} a个整数值。
所以, ⌊ a / n ⌋ \lfloor a/n \rfloor ⌊a/n⌋最多有 2 a 2\sqrt{a} 2a个整数值。
于是,对于
f ( k ) = ∑ k ∣ n μ ( n / k ) ∗ F ( n ) = ∑ k ∣ n μ ( n / k ) ∗ ( ⌊ b / n ⌋ − ⌊ ( a − 1 ) / n ⌋ ) ∗ ( ⌊ d / n ⌋ − ⌊ ( c − 1 ) / n ⌋ ) \begin{aligned} f(k) = \sum_{k|n} \mu(n/k)*F(n) = \sum_{k|n}\mu(n/k)*(\lfloor b/n \rfloor - \lfloor (a-1)/n \rfloor)*(\lfloor d/n \rfloor - \lfloor (c-1)/n\rfloor) \end{aligned} f(k)=k∣n∑μ(n/k)∗F(n)=k∣n∑μ(n/k)∗(⌊b/n⌋−⌊(a−1)/n⌋)∗(⌊d/n⌋−⌊(c−1)/n⌋)
我们只需要枚举 ⌊ b / n ⌋ \lfloor{b/n} \rfloor ⌊b/n⌋, ⌊ ( a − 1 ) / n ⌋ \lfloor (a-1)/n \rfloor ⌊(a−1)/n⌋, ⌊ d / n ⌋ \lfloor d/n \rfloor ⌊d/n⌋, ⌊ ( c − 1 ) / n ⌋ \lfloor (c-1)/n \rfloor ⌊(c−1)/n⌋,最多 8 d 8\sqrt{d} 8d个值。
它们相当于把 n n n的变化范围,分成了 8 d 8\sqrt{d} 8d个区间,每个区间再去求 μ ( n / k ) \mu(n/k) μ(n/k)的区间和,这样就能够在 O ( d ) O(\sqrt{d}) O(d)的时间复杂度求出 f ( k ) f(k) f(k).
这种方法叫整除分块, 形如 a / x a/x a/x的值最多只有 O ( a ) O(\sqrt{a}) O(a)个值,可以将表达式分为 O ( a ) O(\sqrt{a}) O(a)类,最终的时间复杂度可以优化到 O ( a ) O(\sqrt{a}) O(a).
#include <bits/stdc++.h>
using namespace std;
#define LL long long int
#define MAXN 500005
int a, b, c, d, k, T, tot, last;
LL res;
int mu[MAXN], prime[MAXN], premu[MAXN];
bool flg[MAXN];
int getmu(){
mu[1] = 1;
for(int i = 2; i < MAXN; i++){
if(flg[i] == 0) prime[tot++] = i, mu[i] = -1;
for(int j = 0; j < tot; j++){
if(prime[j] * i >= MAXN) break;
flg[prime[j] * i] = 1;
if(i % prime[j] == 0) {
mu[prime[j] * i] = 0;
break;
}
mu[prime[j] * i] = -mu[i];
}
}
}
int getpremu(){
for(int i = 1; i < MAXN; i++){
premu[i] = premu[i - 1] + mu[i];
}
}
int main(){
scanf("%d", &T);
getmu();
getpremu();
while(T--){
scanf("%d %d %d %d %d", &a, &b, &c, &d, &k);
int h1, l1, h2, l2;
res = 0;
last = 0;
for(int i = k; ;i = i + k){
h1 = (b/i);
l1 = (a - 1)/i;
h2 = (d/i);
l2 = (c - 1)/i;
int ii = MAXN;
if(a>i) ii = min(ii, (a-1)/((a-1)/i));
if(b>=i) ii =min(ii, b/(b/i));
if(c>i) ii =min(ii, (c-1)/((c-1)/i));
if(d>=i) ii =min(ii, d/(d/i));
i = ii - ii % k;
if(ii == MAXN)break;
res += 1ll * (premu[i/k] - premu[last/k]) * (h1 - l1) * (h2 - l2);
last = i;
}
printf("%lld\n", res);
}
return 0;
}
(3). YY的GCD
题目描述:
求有多少数对 ( x , y ( 1 ≤ x ≤ n , 1 ≤ y ≤ m ) (x,y(1\leq x \leq n, 1\leq y \leq m) (x,y(1≤x≤n,1≤y≤m)满足 g c d ( x , y ) gcd(x,y) gcd(x,y)为质数。
数据范围
1 ≤ n , m ≤ 1 0 8 , C ≤ 1 0 5 1 \leq n,m \leq 10^8, C \leq 10^5 1≤n,m≤108,C≤105, C C C表示多组数据。
分析
设 f ( p ) f(p) f(p)表示在 x , y x,y x,y的值 n n n范围内 g c d ( x , y ) gcd(x,y) gcd(x,y)为 p p p的对数, 设 F ( p ) F(p) F(p)表示 g c d ( x , y ) gcd(x,y) gcd(x,y)为 p p p的倍数的 ( x , y ) (x,y) (x,y)的对数。
设 P P P为在 m i n ( n , m ) min(n,m) min(n,m)内的质数集合。
则有 F ( p ) = ∑ p ∣ n f ( n ) F(p)=\sum_{p|n}f(n) F(p)=∑p∣nf(n).
F ( 1 ) = ∑ p ≤ n f ( p ) F(1)=\sum_{p\leq n} f(p) F(1)=∑p≤nf(p)
f ( p ) = ∑ p ∣ n μ ( n / p ) F ( n ) f(p) = \sum_{p|n}\mu(n/p)F(n) f(p)=∑p∣nμ(n/p)F(n)
f ( 1 ) = ∑ n μ ( n ) F ( n ) f(1)=\sum_{n}\mu(n)F(n) f(1)=∑nμ(n)F(n)
∑ ( p ∈ P ) ∧ ( 1 ≤ x ≤ n ) ∧ ( 1 ≤ y ≤ m ) f ( p ) = ∑ ( p ∈ P ) ∧ ( 1 ≤ x ≤ n / p ) ∧ ( 1 ≤ y ≤ m / p ) f ( 1 ) = ∑ ( p ∈ P ) ∧ ( 1 ≤ x ≤ n / p ) ∧ ( 1 ≤ y ≤ m / p ) ∧ ( 1 ∣ d ) F ( d ) μ ( d ) = ∑ ( p ∈ P ) ∧ ( d ≤ m i n ( n / p , m / p ) ) μ ( d ) ( ⌊ n / p d ⌋ ∗ ⌊ m / p d ⌋ ) \begin{aligned} \sum_{(p \in P) \land (1 \leq x \leq n) \land (1 \leq y \leq m)}f(p) &= \sum_{(p \in P) \land (1 \leq x \leq n/p) \land (1 \leq y \leq m/p)}f(1) \\ &= \sum_{(p \in P) \land (1 \leq x \leq n/p) \land (1 \leq y \leq m/p) \land(1 |d)} F(d)\mu(d) \\&= \sum_{(p \in P) \land(d \leq min(n/p, m/p))}\mu(d)(\lfloor n/pd \rfloor* \lfloor m/pd \rfloor) \end{aligned} (p∈P)∧(1≤x≤n)∧(1≤y≤m)∑f(p)=(p∈P)∧(1≤x≤n/p)∧(1≤y≤m/p)∑f(1)=(p∈P)∧(1≤x≤n/p)∧(1≤y≤m/p)∧(1∣d)∑F(d)μ(d)=(p∈P)∧(d≤min(n/p,m/p))∑μ(d)(⌊n/pd⌋∗⌊m/pd⌋)
令 p d pd pd=T,
上式变为
∑ ( p ∈ P ) ∧ ( T ≤ m i n ( n , m ) ) μ ( T / p ) ( ⌊ n / T ⌋ ∗ ⌊ m / T ⌋ ) = ∑ T ≤ m i n ( n , m ) ( ⌊ n / T ⌋ ∗ ⌊ m / T ⌋ ) ∑ p ∣ T μ ( T / p ) \begin{aligned} \sum_{(p \in P) \land (T\leq min(n, m))}\mu(T/p)(\lfloor n/T \rfloor * \lfloor m/T \rfloor) &= \sum_{T \leq min(n,m) }(\lfloor n/T \rfloor * \lfloor m/T \rfloor)\sum_{p|T }\mu(T/p)\end{aligned} (p∈P)∧(T≤min(n,m))∑μ(T/p)(⌊n/T⌋∗⌊m/T⌋)=T≤min(n,m)∑(⌊n/T⌋∗⌊m/T⌋)p∣T∑μ(T/p)
n / T , m / T n/T, m/T n/T,m/T最多只有 2 n , 2 m 2\sqrt{n}, 2\sqrt{m} 2n,2m 个,可以采用整除分块,将 T T T的范围分成最多 O ( n ) O(\sqrt{n}) O(n)个区间。后面的 ∑ p ∣ T μ ( T / p ) \sum_{p|T}\mu(T/p) ∑p∣Tμ(T/p),可以提前预处理出来,枚举 p p p,然后去遍历 p p p的倍数,一边遍历,一边累加 μ ( T / p ) \mu(T/p) μ(T/p)即可。 因为:
$\begin{aligned} \sum_{p|T}(T/p)=T\sum_{p|T}1/p \lt T \sum_{x \lt T}1/x \lt TlnT \end{aligned} $
所以每个数均摊下来的时间复杂度是 O ( l n T ) O(lnT) O(lnT)的,而质数的个数为 O ( T / l n T ) O(T/lnT) O(T/lnT)个,所以,这个预处理时间复杂度为 O ( T ) O(T) O(T)的。
每组数据通过整除分块,可以在 N \sqrt{N} N内完成,所以,总的时间复杂度可以降为 C N C\sqrt{N} CN.
#include <bits/stdc++.h>
using namespace std;
#define MAXN 10000000
#define LL long long int
LL res;
int T, tot, n, m;
int mu[MAXN], prime[MAXN], premu[MAXN];
bool flg[MAXN];
void getmu(){
mu[1] = 1;
for(int i = 2; i < MAXN; i++){
if(flg[i] == 0) prime[tot++] = i, mu[i] = -1;
for(int j = 0; j < tot; j++){
if(prime[j] * i >= MAXN) break;
flg[prime[j] * i] = 1;
if(i % prime[j] == 0) {
mu[prime[j] * i] = 0;
break;
}
mu[prime[j] * i] = -mu[i];
}
}
}
void getpremu(){
for(int i = 2; i < MAXN; i++){
if(flg[i] == 0){
for(int j = 1; j * i < MAXN; j++){
premu[j*i] += mu[j];
}
}
}
for(int i = 2; i < MAXN; i++){
premu[i] = premu[i-1] + premu[i];
}
}
int main(){
scanf("%d", &T);
getmu();
getpremu();
while(T--){
scanf("%d %d", &n, &m);
int mi = min(n, m);
int last = 0;
res = 0;
for(int i = 1; i <= mi; ){
last = i - 1;
i = min(n/(n/i), m/(m/i));
res += 1ll*(premu[i] - premu[last])*(n/i)*(m/i);
i++;
}
printf("%lld\n", res);
}
return 0;
}
(4). 数表
题目描述
有一张 n × m n×m n×m 的数表,其第 i i i 行第 j j j 列 ( 1 < = i < = n , 1 < = j < = m ) (1 <= i <= n, 1 <= j <= m) (1<=i<=n,1<=j<=m)的数值为
能同时整除 i 和 j 的所有自然数之和。给定 a , 计算数表中不大于 a 的数之和。
数据范围
有 Q Q Q组数据
1 ≤ n , m ≤ 1 0 5 , ∣ a ∣ ≤ 1 0 9 , Q ≤ 20000 1 \leq n,m \leq 10^5,|a| \leq 10^9, Q \leq 20000 1≤n,m≤105,∣a∣≤109,Q≤20000
分析
如果没有
a
a
a的限制,则要求的是
∑
i
=
1
n
∑
j
=
1
m
σ
(
g
c
d
(
i
,
j
)
)
=
∑
d
=
1
m
i
n
(
n
,
m
)
(
σ
(
d
)
∑
i
=
1
n
∑
j
=
1
m
[
g
c
d
(
i
,
j
)
=
d
]
)
\begin{aligned} \sum_{i=1}^n \sum_{j=1}^m \sigma (gcd(i,j)) =\sum_{d=1}^{min(n,m)} (\sigma(d) \sum_{i=1}^n \sum_{j=1}^m[gcd(i,j)=d]) \end{aligned}
i=1∑nj=1∑mσ(gcd(i,j))=d=1∑min(n,m)(σ(d)i=1∑nj=1∑m[gcd(i,j)=d])
其中 σ ( x ) \sigma(x) σ(x)表示 x x x的约数之和。
设 f ( x ) f(x) f(x)表示 ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = x ] \sum_{i=1}^n\sum_{j=1}^m[gcd(i,j) = x] ∑i=1n∑j=1m[gcd(i,j)=x], F ( x ) F(x) F(x)表示 ∑ i = 1 n ∑ j = 1 m [ x ∣ g c d ( i , j ) ] ) = ⌊ n / x ⌋ ∗ ⌊ m / x ⌋ \sum_{i=1}^n\sum_{j=1}^m [x|gcd(i,j)]) = \lfloor n/x \rfloor * \lfloor m/x \rfloor ∑i=1n∑j=1m[x∣gcd(i,j)])=⌊n/x⌋∗⌊m/x⌋
则有 F ( x ) = ∑ x ∣ p f ( p ) F(x)=\sum_{x|p}f(p) F(x)=∑x∣pf(p)
根据莫比乌斯反演,则有:
f ( x ) = ∑ x ∣ p μ ( p / x ) F ( p ) = ∑ x ∣ p μ ( p / x ) ( ⌊ n / p ⌋ ∗ ⌊ m / p ⌋ ) f(x)=\sum_{x|p}\mu(p/x)F(p)=\sum_{x|p}\mu(p/x)(\lfloor n/p\rfloor * \lfloor m/p \rfloor) f(x)=∑x∣pμ(p/x)F(p)=∑x∣pμ(p/x)(⌊n/p⌋∗⌊m/p⌋)
则式
(
7
)
(7)
(7) 可变为:
∑
d
=
1
m
i
n
(
n
,
m
)
(
σ
(
d
)
∗
f
(
d
)
)
=
∑
d
=
1
m
i
n
(
n
,
m
)
(
σ
(
d
)
∑
d
∣
p
μ
(
p
/
d
)
F
(
p
)
)
=
∑
p
=
1
m
i
n
(
n
,
m
)
F
(
p
)
∑
d
∣
p
σ
(
d
)
∗
μ
(
p
/
d
)
=
∑
p
=
1
m
i
n
(
n
,
m
)
(
⌊
n
/
p
⌋
∗
⌊
m
/
p
⌋
)
∗
∑
d
∣
p
σ
(
d
)
∗
μ
(
p
/
d
)
\begin{aligned} \sum_{d=1}^{min(n,m)}(\sigma(d)*f(d)) &=\sum_{d=1}^{min(n,m)}(\sigma(d)\sum_{d|p}\mu(p/d)F(p)) \\ &=\sum_{p=1}^{min(n,m)}F(p)\sum_{d|p}\sigma(d)*\mu(p/d) \\ &= \sum_{p=1}^{min(n,m)}(\lfloor n/p\rfloor * \lfloor m/p \rfloor) *\sum_{d|p}\sigma(d)*\mu(p/d) \end{aligned}
d=1∑min(n,m)(σ(d)∗f(d))=d=1∑min(n,m)(σ(d)d∣p∑μ(p/d)F(p))=p=1∑min(n,m)F(p)d∣p∑σ(d)∗μ(p/d)=p=1∑min(n,m)(⌊n/p⌋∗⌊m/p⌋)∗d∣p∑σ(d)∗μ(p/d)
可以利用筛法,以
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)的时间复杂度,预处理出来
∑
d
∣
p
σ
(
d
)
∗
μ
(
p
/
d
)
\sum_{d|p}\sigma(d)*\mu(p/d)
∑d∣pσ(d)∗μ(p/d)的前缀和,再利用整除分块在
O
(
n
)
O(\sqrt{n})
O(n)求出答案。
现在考虑 a a a的限制,即
∑ ( d ∣ p ) ∧ ( σ ( d ) ≤ a ) σ ( d ) ∗ μ ( p / d ) \begin{aligned} \sum_{(d|p) \land (\sigma(d) \leq a)} \sigma(d) * \mu(p/d) \end{aligned} (d∣p)∧(σ(d)≤a)∑σ(d)∗μ(p/d)
这个前缀和要怎么求呢?
可以按 a a a由小到大对询问排序,并按 σ ( d ) \sigma(d) σ(d)由小到大对 d d d排序,采用树状数组来维护前缀和,每次将新的符合限制的 σ ( d ) ∗ μ ( p / d ) \sigma(d)*\mu(p/d) σ(d)∗μ(p/d)加入进去。
时间复杂度为 O ( N l o g 2 N + Q n ) O(Nlog^2N+Q\sqrt{n}) O(Nlog2N+Qn)
四、狄利克雷卷积
设 f , g , h f,g,h f,g,h为数论函数, 若 h ( n ) = ∑ d ∣ n f ( d ) ∗ g ( n / d ) h(n)=\sum_{d|n}f(d)*g(n/d) h(n)=∑d∣nf(d)∗g(n/d), 则称 h h h函数是 g , f g,f g,f的狄利克雷卷积,写为: h = f ∗ g h=f*g h=f∗g.
狄利克雷卷积的性质:
一、满足交换律
f ∗ g = ∑ d ∣ n f ( d ) ∗ g ( n / d ) = ∑ d ∣ n f ( n / d ) ∗ g ( d ) = ∑ d ∣ n g ( d ) ∗ f ( n / d ) = g ∗ f f*g=\sum_{d|n}f(d)*g(n/d) = \sum_{d|n}f(n/d)*g(d)=\sum_{d|n}g(d)*f(n/d)=g*f f∗g=∑d∣nf(d)∗g(n/d)=∑d∣nf(n/d)∗g(d)=∑d∣ng(d)∗f(n/d)=g∗f
二、满足结合律
f ∗ g ∗ h = ∑ n ∣ m ( f ∗ g ) ( n ) ∗ g ( m / n ) = ∑ n ∣ m ( ∑ d ∣ n f ( d ) ∗ g ( n / d ) ) ∗ h ( m / n ) = ∑ d ∣ m f ( d ) ∗ ( ∑ j ∣ ( m / d ) g ( j ) ∗ h ( m / ( d j ) ) = ∑ d ∣ m f ( d ) ∗ ( g ∗ h ) ( m / d ) = f ∗ ( g ∗ h ) \begin{aligned} f*g*h &= \sum_{n|m}(f*g)(n)*g(m/n) \\ &= \sum\limits_{n|m}(\sum\limits_{d|n}f(d)*g(n/d))*h(m/n) \\ &= \sum\limits_{d|m}f(d)*(\sum\limits_{j|(m/d)}g(j)*h(m/(dj)) \\ &= \sum_{d|m}f(d)*(g*h)(m/d) \\ &= f*(g*h)\end{aligned} f∗g∗h=n∣m∑(f∗g)(n)∗g(m/n)=n∣m∑(d∣n∑f(d)∗g(n/d))∗h(m/n)=d∣m∑f(d)∗(j∣(m/d)∑g(j)∗h(m/(dj))=d∣m∑f(d)∗(g∗h)(m/d)=f∗(g∗h)
ϵ \epsilon ϵ是单位函数,其他函数与单位函数做狄利克雷卷积后结果不变。它的地位相当于乘法运算中的 1 1 1, 加法运算中的 0 0 0.
三、 f ∗ ϵ = f f*\epsilon = f f∗ϵ=f
四、 μ ∗ I = ϵ \mu * I = \epsilon μ∗I=ϵ, 即莫比乌斯函数和常数函数互在狄利克雷卷积下互为逆元函数。
五、 f ∗ μ = g ⇔ f = g ∗ I f*\mu = g \Leftrightarrow f=g*I f∗μ=g⇔f=g∗I
常见的狄利克雷卷积:
-
μ ∗ I = ϵ \mu * I=\epsilon μ∗I=ϵ
-
μ ∗ I d = ϕ \mu *Id =\phi μ∗Id=ϕ
-
I ∗ I d = σ I * Id = \sigma I∗Id=σ
-
ϕ ∗ I = I d \phi * I = Id ϕ∗I=Id
-
σ ∗ μ = I d \sigma * \mu = Id σ∗μ=Id
这些狄利克雷卷积,和莫比乌斯反演有很密切的关系,但狄利克雷卷积非常简洁,可以帮助我们更好的理解莫比乌斯反演。
-
μ ∗ I = ϵ \mu * I = \epsilon μ∗I=ϵ
莫比乌斯反演形式:
∵ I ( n ) = ∑ d ∣ n ϵ \because I(n)=\sum_{d|n}\epsilon ∵I(n)=∑d∣nϵ(d)$, $
∴ ϵ ( n ) = ∑ d ∣ n μ ( d ) ∗ I ( n / d ) \therefore \epsilon(n) = \sum_{d|n}\mu(d) * I(n/d) ∴ϵ(n)=∑d∣nμ(d)∗I(n/d)
-
μ ∗ I d = ϕ \mu * Id = \phi μ∗Id=ϕ
莫比乌斯反演形式:
$\because n=\sum_{d|n}\phi(n/d) $
∴ ϕ ( n ) = ∑ d ∣ n μ ( d ) ∗ I d ( n / d ) \therefore \phi(n) = \sum_{d|n}\mu(d)*Id(n/d) ∴ϕ(n)=∑d∣nμ(d)∗Id(n/d)
-
I ∗ I d = σ I*Id=\sigma I∗Id=σ
即 σ ( n ) = ∑ d ∣ n d \sigma(n)=\sum_{d|n}d σ(n)=∑d∣nd
-
ϕ ∗ I = I d \phi*I=Id ϕ∗I=Id
同2, 即$n=\sum_{d|n}\phi(n/d) $
-
σ ∗ μ = I d \sigma * \mu = Id σ∗μ=Id, 同 3 3 3, 左右同时乘以 I I I即可.
σ ∗ μ = I d σ ∗ μ ∗ I = I d ∗ I σ = I d ∗ I \begin{aligned} \sigma * \mu &= Id \\ \sigma * \mu * I &= Id * I \\ \sigma &= Id * I \end{aligned} σ∗μσ∗μ∗Iσ=Id=Id∗I=Id∗I