先导知识:
- [ P ] [P] [P]表示当 P P P为真时 [ P ] [P] [P]为1,否则为0。
- a ∣ b a|b a∣b指 b b b被 a a a整除。
- i d ( n ) = n id(n)=n id(n)=n 单位函数,属于完全积性函数,相当于 i d 1 ( n ) id^1(n) id1(n)
数论函数
定义:数论函数指一类定义域是正整数,值域是一个数集的函数。
加法:逐项相加即可
数乘:用一个常数
x
x
x乘
f
(
n
)
=
x
∗
f
(
n
)
f(n)=x∗f(n)
f(n)=x∗f(n)
狄利克雷卷积
定义两个数论函数的狄利克雷卷积 ∗ :
若函数
h
=
f
∗
g
h=f∗g
h=f∗g则:
h
(
n
)
=
∑
d
∣
n
f
(
d
)
∗
g
(
n
d
)
h(n) = \sum\limits_{d|n}f(d)*g(\frac{n}{d})
h(n)=d∣n∑f(d)∗g(dn)
等价于
h
(
n
)
=
∑
i
∗
j
=
n
f
(
i
)
∗
g
(
j
)
h(n) = \sum\limits_{i*j=n}f(i)*g(j)
h(n)=i∗j=n∑f(i)∗g(j)
狄利克雷卷积有以下性质:
1、交换律:
f
∗
g
=
g
∗
f
f∗g=g∗f
f∗g=g∗f
2、结合律:
f
∗
(
g
∗
h
)
=
(
f
∗
g
)
∗
h
f∗(g∗h)=(f∗g)∗h
f∗(g∗h)=(f∗g)∗h
3、分配律:
f
∗
h
+
g
∗
h
=
(
f
+
g
)
∗
h
f∗h+g∗h=(f+g)∗h
f∗h+g∗h=(f+g)∗h
4、单位元:
ϵ
∗
f
=
f
,
其
中
ϵ
(
n
)
=
[
n
=
=
1
]
ϵ∗f=f,其中ϵ(n)=[n==1]
ϵ∗f=f,其中ϵ(n)=[n==1]
5、逆元:对于每一个f(1)≠0的函数f,都有
f
∗
g
=
ϵ
f∗g=ϵ
f∗g=ϵ
求函数逆元ϵ
g
(
n
)
=
1
f
(
1
)
(
ϵ
−
∑
d
∣
n
,
d
≠
1
f
(
d
)
∗
g
(
n
d
)
)
g(n)=\frac{1}{f(1)}(ϵ-\sum\limits_{d|n,d≠1}f(d)*g(\frac{n}{d}))
g(n)=f(1)1(ϵ−d∣n,d=1∑f(d)∗g(dn))
即
∑
d
∣
n
f
(
d
)
∗
g
(
n
d
)
=
f
(
1
)
g
(
n
)
+
∑
d
∣
n
,
d
≠
1
f
(
d
)
∗
g
(
n
d
)
=
ϵ
\sum\limits_{d|n}f(d)*g(\frac{n}{d})=f(1)g(n)+\sum\limits_{d|n,d≠1}f(d)*g(\frac{n}{d})=ϵ
d∣n∑f(d)∗g(dn)=f(1)g(n)+d∣n,d=1∑f(d)∗g(dn)=ϵ
积性函数
如果一个数论函数 f f f有当 g c d ( n , m ) = = 1 gcd(n,m)==1 gcd(n,m)==1时
f ( n ∗ m ) = f ( n ) f ( m ) f(n*m)=f(n)f(m) f(n∗m)=f(n)f(m)
就称 f f f为积性函数。
当
g
c
d
(
n
,
m
)
≠
1
gcd(n,m)≠1
gcd(n,m)=1时,也有
f
(
n
∗
m
)
=
f
(
n
)
f
(
m
)
)
f(n*m)=f(n)f(m))
f(n∗m)=f(n)f(m))时,
f
f
f为完全积性函数。
常见的积性函数有欧拉函数
φ
(
n
)
φ(n)
φ(n),莫比乌斯函数
μ
(
n
)
μ(n)
μ(n),因子和函数
σ
(
n
)
σ(n)
σ(n)等。
莫比乌斯反演
我们先看一个函数:
F ( n ) = ∑ d ∣ n f ( d ) F(n) = \sum\limits_{d|n}f(d) F(n)=d∣n∑f(d)
可以看出:
F
(
1
)
=
f
(
1
)
F(1)=f(1)
F(1)=f(1)
F
(
2
)
=
f
(
1
)
+
f
(
2
)
F(2)=f(1)+f(2)
F(2)=f(1)+f(2)
F
(
3
)
=
f
(
1
)
+
f
(
3
)
F(3)=f(1)+f(3)
F(3)=f(1)+f(3)
F
(
4
)
=
f
(
1
)
+
f
(
2
)
+
f
(
4
)
F(4)=f(1)+f(2)+f(4)
F(4)=f(1)+f(2)+f(4)
F
(
5
)
=
f
(
1
)
+
f
(
5
)
F(5)=f(1)+f(5)
F(5)=f(1)+f(5)
F
(
6
)
=
f
(
1
)
+
f
(
2
)
+
f
(
3
)
+
f
(
6
)
F(6)=f(1)+f(2)+f(3)+f(6)
F(6)=f(1)+f(2)+f(3)+f(6)
F
(
7
)
=
f
(
1
)
+
f
(
7
)
F(7)=f(1)+f(7)
F(7)=f(1)+f(7)
F
(
8
)
=
f
(
1
)
+
f
(
2
)
+
f
(
4
)
+
f
(
8
)
F(8)=f(1)+f(2)+f(4)+f(8)
F(8)=f(1)+f(2)+f(4)+f(8)
找规律可得:
f
(
1
)
=
F
(
1
)
f(1)=F(1)
f(1)=F(1)
f
(
2
)
=
F
(
2
)
−
F
(
1
)
f(2)=F(2)−F(1)
f(2)=F(2)−F(1)
f
(
3
)
=
F
(
3
)
−
F
(
1
)
f(3)=F(3)−F(1)
f(3)=F(3)−F(1)
f
(
4
)
=
F
(
4
)
−
F
(
2
)
f(4)=F(4)−F(2)
f(4)=F(4)−F(2)
f
(
5
)
=
F
(
5
)
−
F
(
1
)
f(5)=F(5)−F(1)
f(5)=F(5)−F(1)
f
(
6
)
=
F
(
6
)
−
F
(
3
)
−
F
(
2
)
+
F
(
1
)
f(6)=F(6)−F(3)−F(2)+F(1)
f(6)=F(6)−F(3)−F(2)+F(1)
f
(
7
)
=
F
(
7
)
−
F
(
1
)
f(7)=F(7)−F(1)
f(7)=F(7)−F(1)
f
(
8
)
=
F
(
8
)
−
F
(
4
)
f(8)=F(8)−F(4)
f(8)=F(8)−F(4)
莫比乌斯公式
由上面的规律可以看出 f ( n ) f(n) f(n)等于加或减去 F ( d ) , d F(d),d F(d),d为 n n n的因子,而是加还是减由理解为是由莫比乌斯函数决定。
这里先给出莫比乌斯反演公式:
f
(
n
)
=
∑
d
∣
n
μ
(
d
)
F
(
n
d
)
f(n) = \sum\limits_{d|n}μ(d)F(\frac{n}{d})
f(n)=d∣n∑μ(d)F(dn)
其他形式:
f
(
n
)
=
∑
n
∣
d
μ
(
d
n
)
F
(
d
)
f(n) = \sum\limits_{n|d}μ(\frac{d}{n})F(d)
f(n)=n∣d∑μ(nd)F(d)
μ即为莫比乌斯函数
μ
(
n
)
=
{
1
n
=
1
(
−
1
)
r
n
=
p
1
p
2
p
3
.
.
.
p
r
,
其
中
p
i
为
不
同
素
数
0
其
他
情
况
μ(n)=\left\{ \begin{aligned} &1& &n=1 \\ &(-1)^r& &n=p^1p^2p^3...p^r,其中p^i为不同素数\\ & 0& &其他情况 \end{aligned} \right.
μ(n)=⎩⎪⎨⎪⎧1(−1)r0n=1n=p1p2p3...pr,其中pi为不同素数其他情况
μ具有以下性质
∑
d
∣
n
μ
(
d
)
=
{
1
n
=
1
0
n
>
1
\sum\limits_{d|n}μ(d)=\left\{\begin{aligned} &1& &n=1 \\ & 0& &n>1\\ \end{aligned} \right.
d∣n∑μ(d)={10n=1n>1
莫比乌斯函数与欧拉函数的联系:
∑
d
∣
n
μ
(
d
)
d
=
φ
(
n
)
n
,
(
i
d
∗
μ
)
(
i
)
=
φ
(
i
)
\sum\limits_{d|n}\frac{μ(d)}{d}=\frac{φ(n)}{n},(id∗μ)(i)=φ(i)
d∣n∑dμ(d)=nφ(n),(id∗μ)(i)=φ(i)
证明上面式子只需把
F
(
n
)
=
n
,
f
(
n
)
=
φ
(
n
)
F(n)=n,f(n)=φ(n)
F(n)=n,f(n)=φ(n)带入莫比乌斯公式即可
下面证明莫比乌斯公式:
f ( n ) = ∑ d ∣ n μ ( d ) F ( n d ) = ∑ d ∣ n μ ( d ) ∑ k ∣ n d f ( k ) = ∑ k ∣ n f ( k ) ∑ d ∣ n d μ ( d ) = f ( k ) f(n) = \sum\limits_{d|n}μ(d)F(\frac{n}{d})=\sum\limits_{d|n}μ(d)\sum\limits_{k|\frac{n}{d}}f(k)=\sum\limits_{k|n}f(k)\sum\limits_{d|\frac{n}{d}}μ(d)=f(k) f(n)=d∣n∑μ(d)F(dn)=d∣n∑μ(d)k∣dn∑f(k)=k∣n∑f(k)d∣dn∑μ(d)=f(k)
这里运用了这条性质
∑
d
∣
n
μ
(
d
)
=
{
1
n
=
1
0
n
>
1
\sum\limits_{d|n}μ(d)=\left\{\begin{aligned} &1& &n=1 \\ & 0& &n>1\\ \end{aligned} \right.
d∣n∑μ(d)={10n=1n>1
当
n
=
1
n=1
n=1时
∑
d
∣
n
μ
(
d
)
\sum\limits_{d|n}μ(d)
d∣n∑μ(d)为
1
1
1,其他情况均为
0
0
0。所以只有
n
d
\frac{n}{d}
dn为
1
1
1时即
n
=
d
n=d
n=d 时
∑
d
∣
n
μ
(
d
)
≠
0
\sum\limits_{d|n}μ(d)≠0
d∣n∑μ(d)=0。
莫比乌斯函数求法
莫比乌斯函数是积性函数,所以我们可以用线性筛 o ( n ) o(n) o(n)求出莫比乌斯函数
int mu[maxx],vis[maxx],prime[maxx];
void slove()
{
mu[1] = 1; cnt = 0;
for(int i=2; i<=n; i++)
{
if(!vis[i])
{
prime[cnt++] = i;
mu[i] = -1;
}
for(int j=0; j<cnt&&i*prime[j]<=n; j++)
{
vis[i*prime[j]] = 1;
if(i%prime[j]==0)
{
mu[i*prime[j]] = 0;
break;
}
mu[i*prime[j]] = -mu[i];
}
}
}
莫比乌斯反演简单应用
求下面函数
∑ i = 1 n ∑ j = 1 m g c d ( i , j ) \sum\limits_{i=1}^n\sum\limits_{j=1}^mgcd(i,j) i=1∑nj=1∑mgcd(i,j) 其中 n < 1 e 7 , m < 1 e 7 n<1e7,m<1e7 n<1e7,m<1e7
上面的式子可以化为
如果
n
>
m
n>m
n>m 交换
n
,
m
n,m
n,m。
∑ d = 1 n ∑ i = 1 n ∑ j = 1 m d [ g c d ( i , j ) = = d ] \sum\limits_{d=1}^n\sum\limits_{i=1}^n\sum\limits_{j=1}^md[gcd(i,j)==d] d=1∑ni=1∑nj=1∑md[gcd(i,j)==d]
∑ d = 1 n d ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ [ g c d ( i , j ) = = 1 ] \sum\limits_{d=1}^nd\sum\limits_{i=1}^{\lfloor\frac{n} {d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}[gcd(i,j)==1] d=1∑ndi=1∑⌊dn⌋j=1∑⌊dm⌋[gcd(i,j)==1]
设 x = ⌊ n d ⌋ , y = ⌊ m d ⌋ x={\lfloor\frac{n}{d}\rfloor},y={\lfloor\frac{m}{d}\rfloor} x=⌊dn⌋,y=⌊dm⌋
∑ d = 1 n d ∑ i = 1 x ∑ j = 1 y [ g c d ( i , j ) = = 1 ] \sum\limits_{d=1}^nd\sum\limits_{i=1}^x\sum\limits_{j=1}^y[gcd(i,j)==1] d=1∑ndi=1∑xj=1∑y[gcd(i,j)==1]
设:
f
(
x
)
=
∑
i
=
1
x
∑
j
=
1
y
[
g
c
d
(
i
,
j
)
=
=
x
]
f(x)=\sum\limits_{i=1}^x\sum\limits_{j=1}^y[gcd(i,j)==x]
f(x)=i=1∑xj=1∑y[gcd(i,j)==x]
F
(
x
)
=
∑
x
∣
d
f
(
d
)
F(x)=\sum\limits_{x|d}f(d)
F(x)=x∣d∑f(d)
所以根据莫比乌斯公式的第二种形式:
f
(
1
)
=
∑
1
∣
d
μ
(
d
1
)
F
(
d
)
f(1)=\sum\limits_{1|d}\mu(\frac{d}{1})F(d)
f(1)=1∣d∑μ(1d)F(d)
f
(
1
)
=
∑
d
=
1
n
μ
(
d
)
F
(
d
)
f(1)=\sum\limits_{d=1}^n\mu(d)F(d)
f(1)=d=1∑nμ(d)F(d)
F
(
x
)
=
∑
x
∣
d
∑
i
=
1
n
∑
j
=
1
m
[
g
c
d
(
i
,
j
)
=
=
d
]
F(x)=\sum\limits_{x|d}\sum\limits_{i=1}^n\sum\limits_{j=1}^m[gcd(i,j)==d]
F(x)=x∣d∑i=1∑nj=1∑m[gcd(i,j)==d]
即:
F
(
x
)
=
∑
i
=
1
n
∑
j
=
1
m
[
x
∣
g
c
d
(
i
,
j
)
]
F(x)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m[x|gcd(i,j)]
F(x)=i=1∑nj=1∑m[x∣gcd(i,j)]
F
(
x
)
=
∑
i
=
1
⌊
n
x
⌋
∑
j
=
1
⌊
m
x
⌋
[
1
∣
g
c
d
(
i
,
j
)
]
F(x)=\sum\limits_{i=1}^{\lfloor\frac{n} {x}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m} {x}\rfloor}[1|gcd(i,j)]
F(x)=i=1∑⌊xn⌋j=1∑⌊xm⌋[1∣gcd(i,j)]
F
(
x
)
=
⌊
n
x
⌋
⌊
m
x
⌋
F(x)={\lfloor\frac{n} {x}\rfloor}{\lfloor\frac{m} {x}\rfloor}
F(x)=⌊xn⌋⌊xm⌋
所以
f
(
1
)
=
∑
i
=
1
x
∑
j
=
1
y
[
g
c
d
(
i
,
j
)
=
=
1
]
=
∑
d
=
1
n
μ
(
d
)
⌊
x
d
⌋
⌊
y
d
⌋
f(1)=\sum\limits_{i=1}^x\sum\limits_{j=1}^y[gcd(i,j)==1]=\sum\limits_{d=1}^n\mu(d){\lfloor\frac{x} {d}\rfloor}{\lfloor\frac{y} {d}\rfloor}
f(1)=i=1∑xj=1∑y[gcd(i,j)==1]=d=1∑nμ(d)⌊dx⌋⌊dy⌋
把
f
(
1
)
f(1)
f(1)带入
∑
d
=
1
n
d
∑
i
=
1
x
∑
j
=
1
y
[
g
c
d
(
i
,
j
)
=
=
1
]
\sum\limits_{d=1}^nd\sum\limits_{i=1}^x\sum\limits_{j=1}^y[gcd(i,j)==1]
d=1∑ndi=1∑xj=1∑y[gcd(i,j)==1]可得
∑
d
=
1
n
d
∑
i
=
1
x
∑
j
=
1
y
[
g
c
d
(
i
,
j
)
=
=
1
]
=
∑
d
=
1
n
d
∑
i
=
1
x
μ
(
i
)
⌊
x
i
⌋
⌊
y
i
⌋
\sum\limits_{d=1}^nd\sum\limits_{i=1}^x\sum\limits_{j=1}^y[gcd(i,j)==1]=\sum\limits_{d=1}^nd\sum\limits_{i=1}^x\mu(i){\lfloor\frac{x} {i}\rfloor}{\lfloor\frac{y} {i}\rfloor}
d=1∑ndi=1∑xj=1∑y[gcd(i,j)==1]=d=1∑ndi=1∑xμ(i)⌊ix⌋⌊iy⌋
上式可以写为:
∑
d
=
1
n
∑
i
=
1
x
d
μ
(
i
)
⌊
x
i
⌋
⌊
y
i
⌋
\sum\limits_{d=1}^n\sum\limits_{i=1}^xd\mu(i){\lfloor\frac{x} {i}\rfloor}{\lfloor\frac{y} {i}\rfloor}
d=1∑ni=1∑xdμ(i)⌊ix⌋⌊iy⌋
代入
x
=
n
d
,
y
=
m
d
x=\frac{n}{d},y=\frac{m}{d}
x=dn,y=dm
∑
d
=
1
n
∑
i
=
1
n
d
d
μ
(
i
)
⌊
n
i
d
⌋
⌊
m
i
d
⌋
\sum\limits_{d=1}^n\sum\limits_{i=1}^{\frac{n}{d}}d\mu(i){\lfloor\frac{n} {id}\rfloor}{\lfloor\frac{m} {id}\rfloor}
d=1∑ni=1∑dndμ(i)⌊idn⌋⌊idm⌋
设
D
=
i
d
D=id
D=id带入可得
∑
D
=
1
n
∑
d
∣
D
d
μ
(
D
d
)
⌊
n
D
⌋
⌊
m
D
⌋
\sum\limits_{D=1}^n\sum\limits_{d|D}d\mu(\frac{D}{d}){\lfloor\frac{n} {D}\rfloor}{\lfloor\frac{m} {D}\rfloor}
D=1∑nd∣D∑dμ(dD)⌊Dn⌋⌊Dm⌋
∑
D
=
1
n
⌊
n
D
⌋
⌊
m
D
⌋
∑
d
∣
D
d
μ
(
D
d
)
\sum\limits_{D=1}^n{\lfloor\frac{n} {D}\rfloor}{\lfloor\frac{m} {D}\rfloor}\sum\limits_{d|D}d\mu(\frac{D}{d})
D=1∑n⌊Dn⌋⌊Dm⌋d∣D∑dμ(dD)
设
∑
d
∣
D
d
μ
(
D
d
)
\sum\limits_{d|D}d\mu(\frac{D}{d})
d∣D∑dμ(dD)为
f
(
D
)
f(D)
f(D)
原式为:
∑
D
=
1
n
⌊
n
D
⌋
⌊
m
D
⌋
f
(
D
)
\sum\limits_{D=1}^n{\lfloor\frac{n} {D}\rfloor}{\lfloor\frac{m} {D}\rfloor}f(D)
D=1∑n⌊Dn⌋⌊Dm⌋f(D)
如果可以计算出
f
(
D
)
f(D)
f(D)就可以通过除法分块解出此题了
接下来我们来讨论
f
(
D
)
f(D)
f(D)
线性筛筛积性函数
显然 f ( D ) f(D) f(D)是一个积性函数。
D
=
∏
i
=
1
r
P
i
a
i
(
P
为
质
数
)
D=\prod_{i=1}^rP_i^{a_i}(P为质数)
D=∏i=1rPiai(P为质数),显然:
f
(
D
)
=
∏
i
=
1
t
f
(
P
i
a
i
)
f(D)=\prod_{i=1}^tf(P_i^{a_i})
f(D)=∏i=1tf(Piai)
f
(
P
i
a
i
)
f(P_i^{a_i})
f(Piai)可以展开为:
f
(
P
i
a
i
)
=
∑
d
∣
P
i
a
i
d
μ
(
D
d
)
=
1
×
μ
(
P
i
a
i
)
+
P
i
×
μ
(
P
i
a
i
−
1
)
+
.
.
.
+
P
i
a
i
×
μ
(
1
)
f(P_i^{a_i})=\sum_{d|P_i^{a_i}}d\mu(\frac Dd)=1\times\mu(P_i^{a_i})+P_i\times\mu(P_i^{a_i-1})+...+P_i^{a_i}\times\mu(1)
f(Piai)=∑d∣Piaidμ(dD)=1×μ(Piai)+Pi×μ(Piai−1)+...+Piai×μ(1)
根据μ的定义可知,
μ
(
P
i
a
i
)
,
μ
(
P
i
a
i
−
1
)
,
.
.
.
,
μ
(
P
i
2
)
\mu(P_i^{a_i}),\mu(P_i^{a_i-1}),...,\mu(P_i^2)
μ(Piai),μ(Piai−1),...,μ(Pi2)都等于0,也就是说,我们只需要考虑这个式子的最后两项。即:
f
(
P
i
a
i
)
=
P
i
(
a
i
−
1
)
×
μ
(
P
i
)
+
P
i
a
i
×
μ
(
1
)
=
−
P
i
(
a
i
−
1
)
+
P
i
a
i
=
P
i
(
a
i
−
1
)
(
P
i
−
1
)
f(P_i^{a_i})=P_i^{(a_i-1)}\times\mu(P_i)+P_i^{a_i}\times\mu(1)=-P_i^{(a_i-1)}+P_i^{a_i}=P_i^{(a_i-1)}(P_i-1)
f(Piai)=Pi(ai−1)×μ(Pi)+Piai×μ(1)=−Pi(ai−1)+Piai=Pi(ai−1)(Pi−1)
所以:
f
(
D
)
=
∏
i
=
1
r
P
i
(
a
i
−
1
)
(
P
i
−
1
)
f(D)=\prod_{i=1}^rP_i^{(a_i-1)}(P_i-1)
f(D)=∏i=1rPi(ai−1)(Pi−1)
考虑线性筛筛法
f
(
D
)
=
{
1
(
D
=
1
)
p
−
1
(
D
i
s
p
r
i
m
e
)
f(D)=\begin{cases}1&(D=1)\\p-1&(D\ is\ prime)\end{cases}
f(D)={1p−1(D=1)(D is prime)
筛的过程中
f
(
i
×
P
j
)
=
{
f
(
i
)
×
f
(
P
j
)
(
P
j
∤
i
)
f
(
i
)
×
P
i
(
P
j
∣
i
)
f(i\times P_j)=\begin{cases}f(i)\times f(P_j)&(P_j\not{|}i)\\f(i)\times P_i&(P_j|i)\end{cases}
f(i×Pj)={f(i)×f(Pj)f(i)×Pi(Pj∣i)(Pj∣i)
此时可以用线性筛就算出 f ( D ) f(D) f(D)了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx=1e7+7,mod=1e9+7;
ll prime[maxx],f[maxx];
bool vis[maxx];
void sieve(int n)//线性筛计算f函数值
{
vis[1]=1;f[1]=1;
for(ll i=2;i<=n;i++)
{
if(!vis[i]) {prime[++prime[0]]=i;f[i]=(i-1)%mod;}
for(ll j=1;j<=prime[0]&&prime[j]*i<=n;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j])
f[i*prime[j]]=(f[i]*f[prime[j]])%mod;
else
{
f[i*prime[j]]=(f[i]*prime[j])%mod;
break;
}
}
}
}
int main()
{
ll n,m;
sieve(10000000);
while(cin>>n>>m)
{
if(n>m) swap(n,m);
ll ans=0;
for(int i=1;i<=n;i++)
{
ans=(ans+(((n/i)*(m/i))%mod*f[i])%mod)%mod;
}
cout<<ans<<endl;
}
}