博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初探莫比乌斯反演及欧拉反演
阅读量:6331 次
发布时间:2019-06-22

本文共 4109 字,大约阅读时间需要 13 分钟。

  莫比乌斯反演是数论中非常重要的一部分,它可以将一个本来只能用时间复杂度极高的枚举求和过程,通过反演变成一个线性时间复杂度甚至根号级别的时间复杂度的问题。在这里,总结一下本人在学习莫比乌斯反演(附带一部分欧拉反演)时的经验和技巧。

  在说反演之前先说一个大多数反演问题都能用到的部分——整除分块

什么是整除分块?举个例子,求$\sum\limits_{i=1}^{n}i\left \lfloor \frac{n}{i} \right \rfloor$,如果暴力枚举要O(n)的时间复杂度,但可以发现对于不同的i,有许多$\left \lfloor \frac{n}{i} \right \rfloor$ 是相等的,而$\left \lfloor \frac{n}{i} \right \rfloor$只有√n种取值。因此可以把取值相同的i分成同一块,求每一块值时只要将这一段的i之和用前缀和处理出来乘上对应的$\left \lfloor \frac{n}{i} \right \rfloor$就好了,时间复杂度降到了根号级别。

代码很简短

int add(int n){    int ans=0;    int r;    for(int l=1;l<=n;l=r+1)    {        r=n/(n/l);        ans+=(sum[r]-sum[l-1])*(n/l);    }}

两个整除分块套在一起的也是同样的

int add(int n,int m){    int ans=0;    int r;    if(n>m)    {        swap(n,m);    }    for(int l=1;l<=n;l=r+1)    {        r=min(n/(n/l),m/(m/l));        ans+=(sum[r]-sum[l-1])*(n/l)*(m/l);    }    return ans;}

一、欧拉反演

欧拉反演不怎么实用,但在做某些题时要比莫比乌斯反演要简便。对于一些求权值和的反演题比较合适。核心公式是$n=\sum\limits_{d|n}^{ }\phi(d)$。

证明:我们把1~n所有数按与n的gcd分类,

$n=\sum\limits_{d|n}^{ }\sum\limits_{i=1}^{n}[gcd(i,n)==d]$

$n=\sum\limits_{d|n}^{ }\sum\limits_{i=1}^{\frac{n}{d}}[gcd(i,\frac{n}{d})==1]$

$n=\sum\limits_{d|n}^{ }\phi(\frac{n}{d})$

因为一个数的约数是"对称"的,所以

$n=\sum\limits_{d|n}^{ }\phi(d)$

知道了公式怎么反演呢?欧拉反演的原理就是把一些式子里求的值,强行换成$\sum\limits_{d|x}^{ }\phi(d)$形式,其中x就是要求的值。

具体怎么实现呢?举个例子:

求$\sum\limits_{i=1}^{n}gcd(i,n)$

求的是所有gcd的值,那么我们可以把gcd(i,n)看成是公式里的n,反演后就是

$\sum\limits_{i=1}^{n}\sum\limits_{d|gcd(i,n)}^{ }\phi(d)$ 

继续推导能得到

$\sum\limits_{i=1}^{n}\sum\limits_{d|i}^{ }\sum\limits_{d|n}^{ }\phi(d)$

$\sum\limits_{d|n}^{ }\sum\limits_{i=1}^{n}\sum\limits_{d|i}^{ }\phi(d)$

对于每个d,在n的范围内只对n/d个数有贡献,因此得到

$\sum\limits_{d|n}^{ }\frac{n}{d}\phi(d)$

这样只要O(√n)枚举约数求欧拉函数就好了。

欧拉反演部分就这么多,虽然不适用于所有反演题,但有时如果用莫比乌斯反演不太容易可以试试欧拉反演。

二、莫比乌斯反演

莫比乌斯反演适用于几乎所有反演题,用于做一些求成立方案数的题,对于求权值和的题可以转化成求方案数一类的问题再进行反演。莫比乌斯反演的核心公式是

$\sum\limits_{d|n}^{ }\mu(d)=\epsilon(n),\epsilon(n)=1,n=1;\epsilon(n)=0,n\neq1$

证明:

将n质因数分解可得n=p1a1p2a2……pkak,由莫比乌斯函数定义可知,非零取值的μ(d)只有d=p1a1p2a2……pkak,其中ai取值为1或0,也就是所有质因子的组合数,即

$(x+y)^k=\sum\limits_{i=0}^{k}C_{k}^{k-i}x^iy^{k-i}$没错,就是二项式定理! 其中x代表选这个质因子,y代表不选。因为选了奇数个值为-1,偶数个值为1,没选的数对结果没影响,所以x=-1,y=1,x+y=0,这时要讨论n是否为1,如果不为1,那么结果就是0了!

莫比乌斯反演的原理就是把原式中判断是否等于1的部分换成$\sum\limits_{d|x}^{ }\mu(d)$ 形式,其中x为原式中判断是否等于1的部分。因为刚才证明了,只有当x=1时才有贡献,与判断是否等于1效果相同。

在举例子之前再介绍一个十分有用的公式

$\phi(n)=\sum\limits_{d|n}^{ }d*\mu(\frac{n}{d})$

怎么来的呢?我们设$f(n)=n,g(n)=1,h(n)=\phi(n)$,

$h(n)*g(n)=\sum\limits_{d|n}^{ }\phi(d)=n=f(n)$其中$*$代表狄利克雷卷积

将等式两边同时卷上μ(n)

$h(n)*g(n)*\mu(n)=f(n)*\mu(n)$

因为卷积有结合律和交换律

$h(n)*(g(n)*\mu(n))=f(n)*\mu(n)$

将合并的卷积展开得到

$h(n)*(\sum\limits_{d|n}^{ }\mu(d))=\sum\limits_{d|n}^{ }d\cdot \mu(\frac{n}{d})$

$h(n)*\epsilon(n)=\sum\limits_{d|n}^{ }d\cdot \mu(\frac{n}{d})$

再合并得到

$\sum\limits_{d|n}^{ }\epsilon(d)\cdot\phi(\frac{n}{d})=\sum\limits_{d|n}^{ }d\cdot \mu(\frac{n}{d})$

因为当d为1时$\epsilon(d)$才有贡献,这时n/d为n左边即为$\phi(n)$,右边就是上面公式里给出的部分。

下面正式开始莫比乌斯反演!

求$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}gcd(i,j)$

显然这是一个求权值和的题,但可以转化成判断是否成立。

我们设gcd(i,j)=d,优先枚举d,判断哪些(i,j)的gcd等于d,为了方便假设n<m

$\sum\limits_{d=1}^{n}d\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)==d]$

因为i与j一定要是d的倍数,所以可以把i,j都除去d,转换为判断除去后的i,j是否互质

$\sum\limits_{d=1}^{n}d\sum\limits_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum\limits_{j=1}^{\left \lfloor \frac{m}{d} \right \rfloor}[gcd(i,j)==1]$

这样就可以莫比乌斯反演了!按照上面说的反演套路把后面的部分换掉。

$\sum\limits_{d=1}^{n}d\sum\limits_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum\limits_{j=1}^{\left \lfloor \frac{m}{d} \right \rfloor}\sum\limits_{p|gcd(i,j)}^{ }\mu(p)$

优先枚举p,即统计每个p对多少对数有贡献

 $\sum\limits_{d=1}^{n}d\sum\limits_{p=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\mu(p)\left \lfloor \frac{n}{dp} \right \rfloor\left \lfloor \frac{m}{dp} \right \rfloor$

当反演时,见到dp就把它换成Q,将前面的枚举d和p换成枚举Q统计每个Q的贡献

$\sum\limits_{Q=1}^{n}\sum\limits_{d|n}^{ }d\cdot\mu(\frac{Q}{d})\left \lfloor \frac{n}{Q} \right \rfloor\left \lfloor \frac{m}{Q} \right \rfloor$

中间那部分是不是很熟悉?没错,就是上面讲的公式。

$\sum\limits_{Q=1}^{n}\phi(Q)\left \lfloor \frac{n}{Q} \right \rfloor\left \lfloor \frac{m}{Q} \right \rfloor$

直接线筛欧拉函数然后整除分块就好了!

莫比乌斯反演的过程大致就是这样的,当然还有些题会筛一个卷积形式的积性函数,用筛积性函数的套路筛就好了。积性函数的线性筛可参见->

转载于:https://www.cnblogs.com/Khada-Jhin/p/9526292.html

你可能感兴趣的文章
java源码-WeakHashMap
查看>>
java ThreadLocal的理解
查看>>
Django 的HttpRequest对象与HttpResponse对象
查看>>
LVS 机制与调度算法(详细)
查看>>
库曼机器人完成数百万天使轮融资,投资方为安乾投资
查看>>
4.5管道实现机制和模拟构建管道「深入浅出ASP.NET Core系列」
查看>>
[UWP]实用的Shape指南
查看>>
云上Hadoop之部署结构
查看>>
MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性
查看>>
Git: 非官方指南,快速掌握就靠它了
查看>>
centos部署vue项目
查看>>
20个非常有用的Java程序片段
查看>>
Eclipse 分屏显示同一个代码文件
查看>>
Windows系统查看CUDA版本号
查看>>
BI系统的前置计算
查看>>
Memcached安装教程及使用
查看>>
这就是2016的我
查看>>
学习编程有没有必要从C语言和C++学起?应该怎么学?
查看>>
2018年Android的保活方案效果统计
查看>>
android中ndk的开发
查看>>