狄利克雷卷积是函数之间的一种运算
定义 ο \omicron ο运算表示狄利克雷卷积
则 h ( n ) = g ( n ) ο f ( n ) h(n)=g(n)\;\omicron\;f(n) h(n)=g(n)οf(n),可读作"g 卷 f"
其含义为 h ( n ) = ∑ d ∣ n g ( d ) f ( n d ) h(n)=\sum_{d\mid n}g(d)f(\frac{n}{d}) h(n)=∑d∣ng(d)f(dn)
狄利克雷卷积的性质:
狄利克雷卷积满足交换律,结合律,分配率,即 :
h
(
n
)
ο
f
(
n
)
=
f
(
n
)
ο
h
(
n
)
h(n)\;\omicron\;f(n)=f(n)\;\omicron\; h(n)
h(n)οf(n)=f(n)οh(n)
h ( n ) ο f ( n ) ο g ( n ) = h ( n ) ο ( f ( n ) ο g ( n ) ) h(n)\;\omicron\;f(n)\;\omicron\;g(n)=h(n)\;\omicron\;(f(n)\;\omicron\;g(n)) h(n)οf(n)οg(n)=h(n)ο(f(n)οg(n))
( h ( n ) + f ( n ) ) ο g ( n ) = h ( n ) ο g ( n ) + f ( n ) ο g ( n ) (h(n)+f(n))\;\omicron\;g(n)=h(n)\;\omicron\;g(n)+f(n)\;\omicron\;g(n) (h(n)+f(n))οg(n)=h(n)οg(n)+f(n)οg(n)
狄利克雷卷积的另一个性质是,两个积性函数的狄利克雷卷积也是积性函数,即
若
n
=
p
×
q
n=p\times q
n=p×q,且 p 与 q 互质,假如
f ( n ) = f ( p ) × f ( q ) f(n)=f(p)\times f(q) f(n)=f(p)×f(q),
g ( n ) = g ( p ) × g ( q ) g(n)=g(p)\times g(q) g(n)=g(p)×g(q),
h ( n ) = g ( n ) ο f ( n ) h(n)=g(n)\;\omicron\;f(n) h(n)=g(n)οf(n),
那么 h ( n ) = h ( p ) × h ( q ) h(n)=h(p) \times h(q) h(n)=h(p)×h(q);
常见的狄利克雷卷积
莫比乌斯函数
μ
(
x
)
\mu(x)
μ(x)
μ
(
x
)
=
{
1
n
=
1
(
−
1
)
k
n
无
平
方
因
数
,
且
n
=
∏
i
=
1
k
p
i
0
其
他
情
况
\mu(x) = \left\{ \begin{array}{lr} 1 & n=1\\ (-1)^k & n无平方因数,且n=\prod_{i=1}^{k}{p_i}\\ 0 & 其他情况 \end{array} \right.
μ(x)=⎩⎨⎧1(−1)k0n=1n无平方因数,且n=∏i=1kpi其他情况
设函数
I
(
n
)
=
1
,
e
(
n
)
=
[
n
=
1
]
,
i
d
(
n
)
=
n
;
I(n)=1,e(n)=[n=1],id(n)=n;
I(n)=1,e(n)=[n=1],id(n)=n;其中[]表示括号内条件成立为1,否则为0
则有四个常见的性质
1:
i
d
=
φ
ο
I
id=\varphi\;\omicron\;I
id=φοI
展开得
n
=
∑
d
∣
n
φ
(
d
)
n=\sum_{d\mid n}{\varphi(d)}
n=∑d∣nφ(d),这是欧拉函数的一个重要性质,因此得证
2:
e
=
μ
ο
I
e=\mu\;\omicron\;I
e=μοI
这个式子ldy大佬讲的时候说,这个不好证,记住就行了
3:任何函数和e做狄利克雷卷积,值都不变
自己展开就得证了
4:
φ
=
i
d
ο
μ
\varphi=id\;\omicron\;\mu
φ=idομ
证明如下
对于性质二的式子:
e
=
μ
ο
I
e=\mu\;\omicron\;I
e=μοI
两边同时卷上
φ
\varphi
φ,则
φ
ο
e
=
μ
ο
I
ο
φ
\varphi\;\omicron\;e=\mu\;\omicron\;I\;\omicron\;\varphi
φοe=μοIοφ
因为卷积具有交换律,结合律,所以
φ
ο
e
=
(
I
ο
φ
)
ο
μ
\varphi\;\omicron\;e=(I\;\omicron\;\varphi)\;\omicron\;\mu
φοe=(Iοφ)ομ
由性质1,性质3得
φ
=
i
d
ο
μ
\varphi=id\;\omicron\;\mu
φ=idομ,得证
由以上性质可以得出一些其他性质:
5:比如,因为
e
=
μ
ο
I
e=\mu\;\omicron\;I
e=μοI
所以
[
n
=
1
]
=
∑
d
∣
n
μ
(
d
)
[n=1]=\sum_{d\mid n}{\mu(d)}
[n=1]=∑d∣nμ(d)
当
n
=
g
c
d
(
i
,
j
)
n=gcd(i,j)
n=gcd(i,j) 的时候
[
g
c
d
(
i
,
j
)
=
1
]
=
∑
d
∣
g
c
d
(
i
,
j
)
μ
(
d
)
=
∑
d
∣
i
,
d
∣
j
μ
(
d
)
[gcd(i,j)=1]=\sum_{d\mid gcd(i,j)}{\mu(d)}=\sum_{d\mid i,d\mid j}{\mu(d)}
[gcd(i,j)=1]=∑d∣gcd(i,j)μ(d)=∑d∣i,d∣jμ(d)
6:同理因为
i
d
=
φ
ο
I
id=\varphi\;\omicron\;I
id=φοI
所以
n
=
∑
d
∣
n
φ
(
d
)
n=\sum_{d\mid n}{\varphi(d)}
n=∑d∣nφ(d)
当
n
=
g
c
d
(
i
,
j
)
n=gcd(i,j)
n=gcd(i,j)时,
g
c
d
(
i
,
j
)
=
∑
d
∣
g
c
d
(
i
,
j
)
φ
(
d
)
=
∑
d
∣
i
,
d
∣
j
φ
(
d
)
gcd(i,j)=\sum_{d\mid gcd(i,j)}{\varphi(d)}=\sum_{d\mid i,d\mid j}{\varphi(d)}
gcd(i,j)=∑d∣gcd(i,j)φ(d)=∑d∣i,d∣jφ(d)
这也成为了计算 gcd 的另一种方法,在化简式子时也很常用
莫比乌斯反演
若f,F为任意函数,则
若
f
ο
I
=
F
f\;\omicron\;I=F
fοI=F
所以同时卷上
μ
\mu
μ
f
ο
I
ο
μ
=
F
ο
μ
\;f\omicron\;I\;\omicron\;\mu=F\;\omicron\;\mu
fοIομ=Fομ
即
f
ο
e
=
F
ο
μ
\;f\omicron\;e=F\;\omicron\;\mu
fοe=Fομ
f
=
F
ο
μ
\;f=F\;\omicron\;\mu
f=Fομ
展开就表示为
若
F
(
n
)
=
∑
d
∣
n
f
(
d
)
F(n)=\sum_{d\mid n}{f(d)}
F(n)=∑d∣nf(d)
则
f
(
n
)
=
∑
d
∣
n
F
(
d
)
μ
(
n
d
)
f(n)=\sum_{d\mid n}{F(d)\mu(\frac{n}{d})}
f(n)=∑d∣nF(d)μ(dn)
这就是莫比乌斯反演,若果
∑
d
∣
n
F
(
d
)
μ
(
n
d
)
\sum_{d\mid n}{F(d)\mu(\frac{n}{d})}
∑d∣nF(d)μ(dn)很好求,就可以求 f
例题 [NOI2010] 能量采集
洛谷题目传送门
化简一下题意,就是求
∑
i
=
1
n
∑
j
=
1
m
(
2
×
g
c
d
(
i
,
j
)
−
1
)
\sum_{i=1}^{n}\sum_{j=1}^{m}(2\times gcd(i,j)-1)
∑i=1n∑j=1m(2×gcd(i,j)−1)
那么也就是求出 ∑ i = 1 n ∑ j = 1 m g c d ( i , j ) \sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j) ∑i=1n∑j=1mgcd(i,j)就可以了
根据上方的性质6,该式子可以化为
∑
i
=
1
n
∑
j
=
1
m
∑
d
∣
i
,
d
∣
j
φ
(
d
)
\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d\mid i,d\mid j}{\varphi(d)}
∑i=1n∑j=1m∑d∣i,d∣jφ(d)
将最后一个
∑
\sum
∑提前,得
∑
d
m
i
n
(
m
,
n
)
φ
(
d
)
∑
d
∣
i
n
∑
d
∣
j
m
1
\sum_d^{min(m,n)}\varphi(d)\sum_{d\mid i}^n\sum_{d\mid j}^m 1
∑dmin(m,n)φ(d)∑d∣in∑d∣jm1
将最后一项化简,得
∑
d
m
i
n
(
m
,
n
)
φ
(
d
)
⌊
n
d
⌋
⌊
m
d
⌋
\sum_d^{min(m,n)}\varphi(d)\lfloor \frac{n}{d} \rfloor\lfloor \frac{m}{d} \rfloor
∑dmin(m,n)φ(d)⌊dn⌋⌊dm⌋
于是我们预处理处每一个
φ
(
d
)
\varphi(d)
φ(d),就行了
最后把答案乘2,在减去n*m就行了
#include<bits/stdc++.h>
using namespace std;
const long long N = 1e5+7;
long long phi[N],n,m;
void euler(long long n)
{
for(long long i=1;i<=n;i++)
phi[i]=i;
for(long long i=2;i<=n;i++)
{
if(phi[i]==i)
{
for(long long j=i;j<=n;j+=i)
phi[j]=phi[j]/i*(i-1);
}
}
}
int main()
{
cin>>n;
cin>>m;
euler(min(n,m));
long long ans=0;
for(long long i=1;i<=min(n,m);i++)
{
ans=ans+phi[i]*floor(n/i)*floor(m/i);
}
cout<<2*ans-(m*n);
return 0;
}