容斥原理与莫比乌斯函数

容斥原理

回想一下我们是怎么计算欧拉函数的.

若合数 C = P 1 ∗ P 2 C=P1 * P2 C=P1P2.

对于素数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)=CP1CP2C+P1P2C=C(1P11P21+P1P21)=C(1P11)(1P21).

C = P 1 ∗ P 2 ∗ P 3 C=P1*P2*P3 C=P1P2P3时,

ϕ ( 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(1P11P21P31+P1P21+P1P31+P2P31P1P2P31)=C(1P11)(1P21)(1P31).

我们做了什么

第一个例子 C = P 1 ∗ P 2 C = P_1*P_2 C=P1P2是很好理解的.那么第二个呢?

从全集中删除出现P1,P2,P3的倍数,由于P1*P2的倍数被额外删去一次,所以需要加回来,包括其他譬如P2*P3,P1*P3等等.

然后再减去 P 1 ∗ P 2 ∗ P 3 P_1*P_2*P_3 P1P2P3,感性地理解这个也许不难,那么C的每一个因子对最后的结果的贡献都是0吗.

又或者说是否每一个因子最后都被恰好减去一次呢?

证明:

对于 C = P 1 ∗ P 2 ∗ . . . ∗ P m C = P_1*P_2*...*P_m C=P1P2...Pm有一因子是 T = P 1 ∗ P 2 ∗ . . . ∗ P t   [ t < = m ] T=P_1*P_2*...*P_t \space [t<=m] T=P1P2...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 P1P2,P1P3,P2P3,P1P4等等这些所有的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 P1P2P3,P2P3P4,P1P2P4等等,所有的三级数,一共减去了 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 Ct0Ct1+Ct2 Ct3+ Ct4 Ct5+ ...Ctt
这个式子实际上其实是 ( 1 − 1 ) t (1-1)^t (11)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=P1P1P2P3...Pr而言,是没有必要再枚举因子P1*P1的倍数了,因子它本身就是P1的倍数,定义它为非级数(系数为0的r级数).

亦或者你可以将其贡献认作一个没有贡献(即系数为0)的1级数– 0 ∗ C t 1 0*C_t^1 0Ct1.

那么现在你对欧拉函数的理解更深了吗.

莫比乌斯函数

同样地,我们考虑计算欧拉函数.

在计算欧拉函数中
ϕ ( 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)=CP1CP2CP3C+P1P2C+P1P3C+P2P3CP1P2P3C
如果说我们凭空捏造一个函数sign(x)表示计算 x = P 1 ∗ P 2 x=P_1*P_2 x=P1P2时的符号位.那么上式可以写成这样.
ϕ ( 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(P1P2)P1P2C+s(P1P3)P1P3C+s(P2P3)P2P3C+s(P1P2P3)P1P2P3C
现在函数 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=P1P1P2...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)=dCs(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 xa1 mod p).

在此条件下
a ∗ x ≡ 1   m o d   p a*x \equiv 1 \space mod \space p ax1 mod p
那么这么一个pair< I , μ I,\mu I,μ>,他们的乘积又会是什么呢.
ϵ = I ∗ μ ϵ = ∑ d ∣ N μ ( d ) ∗ 1 \epsilon = I*\mu \\ \epsilon = \sum_{d|N}\mu(d)*1 ϵ=Iμϵ=dNμ(d)1
这个式子貌似我们已经计算过了(之前的二项式展开),只有在[N==1]的时候其值为1,其他时候都为0.

于是我们得到了一个看上去没什么用的函数–狄利克雷卷积单位元
ϵ ( n ) = [ n = = 1 ] \epsilon(n) = [n==1] ϵ(n)=[n==1]
这个莫名其妙的函数有一个莫名其妙的性质,任何积性函数和它的卷积都是它本身,就像等式 a ∗ 1 = a a*1=a a1=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)=dnϵ(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)=in[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)=in[t==1]
现在这个是不是和 ϵ \epsilon ϵ函数有点像,我们可以这么写
ϕ ( n ) = ∑ i n ϵ ( g c d ( i , n ) ) \phi(n)=\sum_i^n{\epsilon(gcd(i,n))} ϕ(n)=inϵ(gcd(i,n))
那么按照 ϵ = u ∗ I \epsilon = u *I ϵ=uI
ϕ ( 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)=indgcd(i,n)μ(d)=indi&&dnμ(d)
现在涉及一些之前没讲的 【求和换元】,但是问题不大.

第二个求和式的枚举元d的取值范围是多少?n的因子.

那么如果枚举d的话id的相对关系呢? 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)=dnμ(d)in/d1=dnμ(d)dn=μId
这显然就是之前证明过的式子.

我们可以发现,可以通过对方括号表达式使用单位元函数,同时,又能将单位元函数转换成莫比乌斯函数的求和.

而这一步恰好就是莫比乌斯反演.

样例2:
∑ i n g c d ( i , n ) \sum_i^n gcd(i,n) ingcd(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] in d [gcd(i,n)==d]
但是我们需要计算1 ~ n之间所有的gcd(i,n),其值域 d ∣ n d|n dn.
∑ d ∣ n ∑ i n d [ g c d ( i , n ) = = d ] \sum_{d|n}\sum_i^nd[gcd(i,n)==d] dnind[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} =dnin/dd[gcd(i,n/d)==1]=dnin/ddpgcd(i,n/d)μ(p)=dndpi,pdnμ(p)in/d1=dndpdnμ(p)in/dp1=dndpdnμ(p)dpn=dndϕ(n/d)

杂谈

数论系列还有其他两节,如果在阅读中有什么概念不懂可以参考之前写的积性函数数论分块.

未来的学习包括但不限于,求对积性函数求前缀和(杜教筛),换元,用埃式筛预处理(包括增量预处理<差分>和直接预处理).

但是考虑到本人能力有限,就不一一讲述.

本节学习只是带各位入门莫比乌斯反演,但是还需要大量的模型练习才能熟练使用.

相信有了这次的学习,已经为你以后的数论学习带来很大的帮助,已经具备学习其他知识点的能力,(杜教筛网上有更好的资源提供,我就不献丑了).

习题

1.快速预处理出 i k i^k ik(1e7内 O(n)).–积性函数

2.快速求出每个数因子个数要求每次查询(1e7以内)(logn) 欧拉函数

3.洛谷,P2398 GCD SUM.欧拉函数

4.P1390 公约数的和.反演,欧拉函数

5.bzoj4804 .反演

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值