容斥原理
回想一下我们是怎么计算欧拉函数的.
若合数 C = P 1 ∗ P 2 C=P1 * P2 C=P1∗P2.
对于素数P1
,p1的倍数有P1,2P1,3P1,..(C/P1)*P1
共计C/P1
个,同理,1~C
中P2的倍数有C/P2
个.
如果我们把这C/P1+C/P2
数去掉,那么P1*P2的倍数被排除了两次,需要再加回来一次.
因此贡献是 ϕ ( C ) = C − C P 1 − C P 2 + C P 1 ∗ P 2 = C ∗ ( 1 − 1 P 1 − 1 P 2 + 1 P 1 ∗ P 2 ) = C ∗ ( 1 − 1 P 1 ) ∗ ( 1 − 1 P 2 ) \phi(C)=C-\frac{C}{P1}-\frac{C}{P2}+\frac{C}{P1*P2}=C*(1-\frac{1}{P1}-\frac{1}{P2}+\frac{1}{P1*P2})=C*(1-\frac{1}{P1})*(1-\frac{1}{P2}) ϕ(C)=C−P1C−P2C+P1∗P2C=C∗(1−P11−P21+P1∗P21)=C∗(1−P11)∗(1−P21).
当 C = P 1 ∗ P 2 ∗ P 3 C=P1*P2*P3 C=P1∗P2∗P3时,
ϕ ( C ) = C ∗ ( 1 − 1 P 1 − 1 P 2 − 1 P 3 + 1 P 1 ∗ P 2 + 1 P 1 ∗ P 3 + 1 P 2 ∗ P 3 − 1 P 1 ∗ P 2 ∗ P 3 ) = C ∗ ( 1 − 1 P 1 ) ∗ ( 1 − 1 P 2 ) ∗ ( 1 − 1 P 3 ) \phi(C)=C*(1-\frac{1}{P1}-\frac{1}{P2}-\frac{1}{P3}+\frac{1}{P1*P2}+\frac{1}{P1*P3}+\frac{1}{P2*P3}-\frac{1}{P1*P2*P3})=C*(1-\frac{1}{P1})*(1-\frac{1}{P2})*(1-\frac{1}{P3}) ϕ(C)=C∗(1−P11−P21−P31+P1∗P21+P1∗P31+P2∗P31−P1∗P2∗P31)=C∗(1−P11)∗(1−P21)∗(1−P31).
我们做了什么
第一个例子 C = P 1 ∗ P 2 C = P_1*P_2 C=P1∗P2是很好理解的.那么第二个呢?
从全集中删除出现P1,P2,P3
的倍数,由于P1*P2
的倍数被额外删去一次,所以需要加回来,包括其他譬如P2*P3
,P1*P3
等等.
然后再减去 P 1 ∗ P 2 ∗ P 3 P_1*P_2*P_3 P1∗P2∗P3,感性地理解这个也许不难,那么C的每一个因子对最后的结果的贡献都是0吗.
又或者说是否每一个因子最后都被恰好减去一次呢?
证明:
对于 C = P 1 ∗ P 2 ∗ . . . ∗ P m C = P_1*P_2*...*P_m C=P1∗P2∗...∗Pm有一因子是 T = P 1 ∗ P 2 ∗ . . . ∗ P t [ t < = m ] T=P_1*P_2*...*P_t \space [t<=m] T=P1∗P2∗...∗Pt [t<=m].
为了方便讲述,这里引入一个概念叫级数,表示当前数由几种(不是个)质因子组成,就称为几级数.
对于因子T
,它会在
P
1
P_1
P1枚举倍数的时候删除,以及
P
2
P_2
P2枚举倍数的时候删除,还有
P
3
,
P
4
P_3,P_4
P3,P4等等直到
P
t
P_t
Pt,这些都是1级数.一共被删去t次,t
同样,我们再按照我感性地认知加回来一些,能把它加回来的是 P 1 ∗ P 2 , P 1 ∗ P 3 , P 2 ∗ P 3 , P 1 ∗ P 4 P_1*P_2,P_1*P_3,P_2*P_3,P_1*P_4 P1∗P2,P1∗P3,P2∗P3,P1∗P4等等这些所有的2级数,实际上啊就是加回来 C t 2 C_t^2 Ct2次
然后再考虑被减去,这次是 P 1 ∗ P 2 ∗ P 3 , P 2 ∗ P 3 ∗ P 4 , P 1 ∗ P 2 ∗ P 4 P_1*P_2*P_3,P_2*P_3*P_4,P_1*P_2*P_4 P1∗P2∗P3,P2∗P3∗P4,P1∗P2∗P4等等,所有的三级数,一共减去了 C t 3 C_t^3 Ct3次.
这时我们发现1级数其实就是
C
t
1
C_t^1
Ct1.于是直接写到t级数,再考虑以下贡献.
−
C
t
1
+
C
t
2
−
C
t
3
+
C
t
4
−
C
t
5
+
.
.
.
−
C
t
t
-C_t^1 + C_t^2- \ C_t^3 + \ C_t^4 - \ C_t^5 + \ ... - C_t^t
−Ct1+Ct2− Ct3+ Ct4− Ct5+ ...−Ctt
一开始我们是从全集里面减去,所以考虑再加上1,也就是
C
t
0
C_t^0
Ct0.于是有了下式.
C
t
0
−
C
t
1
+
C
t
2
−
C
t
3
+
C
t
4
−
C
t
5
+
.
.
.
−
C
t
t
C_t^0-C_t^1 + C_t^2- \ C_t^3 + \ C_t^4 - \ C_t^5 + \ ... - C_t^t
Ct0−Ct1+Ct2− Ct3+ Ct4− Ct5+ ...−Ctt
这个式子实际上其实是
(
1
−
1
)
t
(1-1)^t
(1−1)t的二次项展开,各位可以自己试一试.
那上式和为0那自不用说.至此,也就证明了我们的感性写法是可以做到每个C
的因子(除1,1不含质数因子,(1-1)^0=1)的贡献都是0
的.
同时,对于C
的因子
R
=
P
1
∗
P
1
∗
P
2
∗
P
3
∗
.
.
.
∗
P
r
R = P_1*P_1*P_2*P_3*...*P_r
R=P1∗P1∗P2∗P3∗...∗Pr而言,是没有必要再枚举因子P1*P1
的倍数了,因子它本身就是P1
的倍数,定义它为非级数(系数为0的r级数).
亦或者你可以将其贡献认作一个没有贡献(即系数为0)的1级数– 0 ∗ C t 1 0*C_t^1 0∗Ct1.
那么现在你对欧拉函数的理解更深了吗.
莫比乌斯函数
同样地,我们考虑计算欧拉函数.
在计算欧拉函数中
ϕ
(
C
)
=
C
−
C
P
1
−
C
P
2
−
C
P
3
+
C
P
1
∗
P
2
+
C
P
1
∗
P
3
+
C
P
2
∗
P
3
−
C
P
1
∗
P
2
∗
P
3
\begin{aligned} \phi(C)&=C-\frac{C}{P_1}-\frac{C}{P_2}-\frac{C}{P_3} \\ &+\frac{C}{P_1*P_2}+\frac{C}{P_1*P_3}+\frac{C}{P_2*P_3} \\ &-\frac{C}{P_1*P_2*P_3} \end{aligned}
ϕ(C)=C−P1C−P2C−P3C+P1∗P2C+P1∗P3C+P2∗P3C−P1∗P2∗P3C
如果说我们凭空捏造一个函数sign(x)表示计算
x
=
P
1
∗
P
2
x=P_1*P_2
x=P1∗P2时的符号位.那么上式可以写成这样.
ϕ
(
C
)
=
s
(
1
)
∗
C
+
s
(
p
1
)
∗
C
P
1
+
s
(
P
2
)
∗
C
P
2
+
s
(
P
3
)
∗
C
P
3
+
s
(
P
1
∗
P
2
)
∗
C
P
1
∗
P
2
+
s
(
P
1
∗
P
3
)
∗
C
P
1
∗
P
3
+
s
(
P
2
∗
P
3
)
∗
C
P
2
∗
P
3
+
s
(
P
1
∗
P
2
∗
P
3
)
∗
C
P
1
∗
P
2
∗
P
3
\begin{aligned} \phi(C)&=s(1)*C+s(p_1)*\frac{C}{P_1}+s(P_2)*\frac{C}{P_2}+s(P_3)*\frac{C}{P_3} \\ &+s(P_1*P_2)*\frac{C}{P_1*P_2}+s(P_1*P_3)*\frac{C}{P_1*P_3}+s(P_2*P_3)*\frac{C}{P_2*P_3} \\ &+s(P_1*P_2*P_3)*\frac{C}{P_1*P_2*P_3} \end{aligned}
ϕ(C)=s(1)∗C+s(p1)∗P1C+s(P2)∗P2C+s(P3)∗P3C+s(P1∗P2)∗P1∗P2C+s(P1∗P3)∗P1∗P3C+s(P2∗P3)∗P2∗P3C+s(P1∗P2∗P3)∗P1∗P2∗P3C
现在函数
s
(
x
)
s(x)
s(x)的值域是{-1,1},如果像我们之前所说的对于因子
R
=
P
1
∗
P
1
∗
P
2
∗
.
.
.
∗
P
r
R=P_1*P_1*P_2*...*P_r
R=P1∗P1∗P2∗...∗Pr,认为它是一个系数为0的r
级数的话.
那么就有值域为{-1,0,1}的
s
(
x
)
s(x)
s(x)函数,那么我们可以写下这个式子
ϕ
(
C
)
=
∑
d
∣
C
s
(
d
)
∗
C
d
\phi(C) = \sum_{d|C} s(d)* \frac{C}{d}
ϕ(C)=d∣C∑s(d)∗dC
现在整理一下
s
(
x
)
s(x)
s(x)的表达式发现,对于偶数级数,其符号都是"+",而奇数级数则都是"-"
s
(
x
)
=
{
0
,
非
级
数
(
−
1
)
k
,
k
级
数
s(x)= \left\{\begin{matrix} 0 \ \ \ \ \ \ \ \ \ \ \ \ \ \ ,非级数\\ {(-1)}^k\ \ \ \ \ ,k级数 \end{matrix}\right.
s(x)={0 ,非级数(−1)k ,k级数
同学们说不定已经猜到了,其实这个函数
s
(
x
)
s(x)
s(x)就是莫比乌斯函数
μ
(
x
)
\mu(x)
μ(x)
还记得用代码求欧拉函数吗?
const int maxn = 1e6+10;
int pri[maxn/8],tot,phi[maxn];
bool vis[maxn];
void init()
{
phi[1]=1;
for(int i=2;i<maxn;++i){
if(!vis[i])pri[++tot]=i,phi[i]=i-1;
//质数的欧拉函数是质数减一
for(int j=1;j<=tot&&i*pri[j]<maxn;++j){
vis[i*pri[j]]=1;
if(i%pri[j])phi[i*pri[j]]=phi[i]*(pri[j]-1);//新增质数时*(j-1)
else {
phi[i*pri[j]]=phi[i]*pri[j];//不是新增直接乘
break;
}
}
}
}
我们是通过是否新增质数来计算的.求得当前欧拉函数值与之前的欧拉函数值的关系( μ ( x ) \mu(x) μ(x)求法留作课后作业自己完成).
狄利克雷卷积单位元
还记得之前说过的单位函数 I d Id Id吗, I d ( x ) = x Id(x)=x Id(x)=x.
在求解
μ
(
x
)
\mu(x)
μ(x)函数的时候我们也证明了
ϕ
=
I
d
∗
μ
\phi = Id * \mu
ϕ=Id∗μ
而在【欧拉函数】一节中证明了
I
d
=
ϕ
∗
I
Id = \phi * I
Id=ϕ∗I
其中
I
I
I是不变函数
I
(
x
)
=
1
I(x)=1
I(x)=1.
很有意思的是,存在一个pair< I I I, μ \mu μ>,使得 I d Id Id和 ϕ \phi ϕ可以互相转换.
这就类似于a与a的逆元(存在一个数x在模P条件下 x ≡ 1 a m o d p x \equiv \frac{1}{a} \space mod \space p x≡a1 mod p).
在此条件下
a
∗
x
≡
1
m
o
d
p
a*x \equiv 1 \space mod \space p
a∗x≡1 mod p
那么这么一个pair
<
I
,
μ
I,\mu
I,μ>,他们的乘积又会是什么呢.
ϵ
=
I
∗
μ
ϵ
=
∑
d
∣
N
μ
(
d
)
∗
1
\epsilon = I*\mu \\ \epsilon = \sum_{d|N}\mu(d)*1
ϵ=I∗μϵ=d∣N∑μ(d)∗1
这个式子貌似我们已经计算过了(之前的二项式展开),只有在[N==1]
的时候其值为1,其他时候都为0.
于是我们得到了一个看上去没什么用的函数–狄利克雷卷积单位元
ϵ
(
n
)
=
[
n
=
=
1
]
\epsilon(n) = [n==1]
ϵ(n)=[n==1]
这个莫名其妙的函数有一个莫名其妙的性质,任何积性函数和它的卷积都是它本身,就像等式
a
∗
1
=
a
a*1=a
a∗1=a中的
1
1
1,类似这样
ϕ
=
ϕ
∗
ϵ
\phi = \phi *\epsilon
ϕ=ϕ∗ϵ
原因就是这类积性函数的乘积是这样算的
ϕ
(
n
)
=
∑
d
∣
n
ϵ
(
n
d
)
ϕ
(
d
)
\phi(n) = \sum_{d|n}\epsilon(\frac{n}{d})\phi(d)
ϕ(n)=d∣n∑ϵ(dn)ϕ(d)
只有在
n
d
=
=
1
\frac{n}{d}==1
dn==1也就是
n
=
=
d
n==d
n==d的时候
ϕ
\phi
ϕ函数的系数才会等于1,并且此时的贡献是
1
∗
ϕ
(
n
)
1*\phi(n)
1∗ϕ(n),其他时候都是0
.
说了这么多,这个函数到底有什么用.
来看!!!
样例1:
熟悉的欧拉函数.
ϕ
(
n
)
=
∑
i
n
[
g
c
d
(
i
,
n
)
=
=
1
]
\phi(n)=\sum_i^n{[gcd(i,n)==1]}
ϕ(n)=i∑n[gcd(i,n)==1]
令
t
=
g
c
d
(
i
,
n
)
t = gcd(i,n)
t=gcd(i,n),
ϕ
(
n
)
=
∑
i
n
[
t
=
=
1
]
\phi(n)=\sum_i^n{[t==1]}
ϕ(n)=i∑n[t==1]
现在这个是不是和
ϵ
\epsilon
ϵ函数有点像,我们可以这么写
ϕ
(
n
)
=
∑
i
n
ϵ
(
g
c
d
(
i
,
n
)
)
\phi(n)=\sum_i^n{\epsilon(gcd(i,n))}
ϕ(n)=i∑nϵ(gcd(i,n))
那么按照
ϵ
=
u
∗
I
\epsilon = u *I
ϵ=u∗I
ϕ
(
n
)
=
∑
i
n
∑
d
∣
g
c
d
(
i
,
n
)
μ
(
d
)
=
∑
i
n
∑
d
∣
i
&
&
d
∣
n
μ
(
d
)
\begin{aligned} \phi(n)&=\sum_i^n{\sum_{d|gcd(i,n)}\mu(d)} \\ &=\sum_i^n{\sum_{d|i \&\& d|n}\mu(d)} \end{aligned}
ϕ(n)=i∑nd∣gcd(i,n)∑μ(d)=i∑nd∣i&&d∣n∑μ(d)
现在涉及一些之前没讲的 【求和换元】,但是问题不大.
第二个求和式的枚举元d
的取值范围是多少?n
的因子.
那么如果枚举d
的话i
的d
的相对关系呢?
i
=
λ
∗
d
i=\lambda * d
i=λ∗d.
ϕ
(
n
)
=
∑
d
∣
n
μ
(
d
)
∑
i
n
/
d
1
=
∑
d
∣
n
μ
(
d
)
∗
n
d
=
μ
∗
I
d
\begin{aligned} \phi(n) &= \sum_{d|n}\mu(d)\sum_{i}^{n/d}1 \\ &= \sum_{d|n}\mu(d)*\frac{n}{d} \\ &=\mu*Id \end{aligned}
ϕ(n)=d∣n∑μ(d)i∑n/d1=d∣n∑μ(d)∗dn=μ∗Id
这显然就是之前证明过的式子.
我们可以发现,可以通过对方括号表达式使用单位元函数,同时,又能将单位元函数转换成莫比乌斯函数的求和.
而这一步恰好就是莫比乌斯反演.
样例2:
∑
i
n
g
c
d
(
i
,
n
)
\sum_i^n gcd(i,n)
i∑ngcd(i,n)
令
d
=
g
c
d
(
i
,
n
)
d = gcd(i,n)
d=gcd(i,n),并且如果说我们仅计算特定的d的话,可以写作这样
∑
i
n
d
[
g
c
d
(
i
,
n
)
=
=
d
]
\sum_i^n \space d \space [gcd(i,n)==d]
i∑n d [gcd(i,n)==d]
但是我们需要计算1 ~ n
之间所有的gcd(i,n)
,其值域
d
∣
n
d|n
d∣n.
∑
d
∣
n
∑
i
n
d
[
g
c
d
(
i
,
n
)
=
=
d
]
\sum_{d|n}\sum_i^nd[gcd(i,n)==d]
d∣n∑i∑nd[gcd(i,n)==d]
若先枚举d,则对于第二个求和符号而言,i
将会是属于
i
=
d
i
′
i= di'
i=di′,而此时
i
′
i'
i′的范围则是
[
1
,
n
/
d
]
[1,n/d]
[1,n/d].
=
∑
d
∣
n
∑
i
n
/
d
d
[
g
c
d
(
i
,
n
/
d
)
=
=
1
]
=
∑
d
∣
n
∑
i
n
/
d
d
∑
p
∣
g
c
d
(
i
,
n
/
d
)
μ
(
p
)
=
∑
d
∣
n
d
∑
p
∣
i
,
p
∣
n
d
μ
(
p
)
∑
i
n
/
d
1
=
∑
d
∣
n
d
∑
p
∣
n
d
μ
(
p
)
∑
i
n
/
d
p
1
=
∑
d
∣
n
d
∑
p
∣
n
d
μ
(
p
)
n
d
p
=
∑
d
∣
n
d
ϕ
(
n
/
d
)
\begin{aligned} &=\sum_{d|n}\sum_i^{n/d}d[gcd(i,n/d)==1] \\ &=\sum_{d|n}\sum_i^{n/d}d\sum_{p|gcd(i,n/d)}\mu(p) \\ &=\sum_{d|n}d\sum_{p|i,p| \frac{n}{d}}\mu(p)\sum_i^{n/d}1 \\ &=\sum_{d|n}d\sum_{p| \frac{n}{d}}\mu(p)\sum_i^{n/dp}1 \\ &=\sum_{d|n}d\sum_{p| \frac{n}{d}}\mu(p) \frac{n}{dp} \\ &=\sum_{d|n}d\phi(n/d) \end{aligned}
=d∣n∑i∑n/dd[gcd(i,n/d)==1]=d∣n∑i∑n/ddp∣gcd(i,n/d)∑μ(p)=d∣n∑dp∣i,p∣dn∑μ(p)i∑n/d1=d∣n∑dp∣dn∑μ(p)i∑n/dp1=d∣n∑dp∣dn∑μ(p)dpn=d∣n∑dϕ(n/d)
杂谈
数论系列还有其他两节,如果在阅读中有什么概念不懂可以参考之前写的积性函数和数论分块.
未来的学习包括但不限于,求对积性函数求前缀和(杜教筛),换元,用埃式筛预处理(包括增量预处理<差分>和直接预处理).
但是考虑到本人能力有限,就不一一讲述.
本节学习只是带各位入门莫比乌斯反演,但是还需要大量的模型练习才能熟练使用.
相信有了这次的学习,已经为你以后的数论学习带来很大的帮助,已经具备学习其他知识点的能力,(杜教筛网上有更好的资源提供,我就不献丑了).
习题
1.快速预处理出 i k i^k ik(1e7内 O(n)).–积性函数
2.快速求出每个数因子个数要求每次查询(1e7以内)(logn) 欧拉函数
3.洛谷,P2398 GCD SUM.欧拉函数
4.P1390 公约数的和.反演,欧拉函数
5.bzoj4804 .反演