「莫比乌斯反演」

引入

在考虑\(F(n)=\sum\limits_{d|n}f(d)\)时,假设已知函数\(F\),能不能通过若干\(F(i)\)的加减得到\(f(j)\)呢?找规律后发现好像可以,并且好像用到的\(i\)都是\(j\)的因数。由此我们能不能通过给每个因子的\(F\)乘上一个系数,可以是0或1或-1,这样来得到\(f(j)\)呢?也就是,我们猜想是否有一个函数\(\mu\)能够使得\(f(n)=\sum\limits_{d|n}\mu(d)F(\dfrac{n}{d})\)呢?我们称这个过程为反演,其中\(\mu\)就是莫比乌斯函数。

莫比乌斯函数\(\mu\)的定义

特殊地,\(\mu(1)=1\),对于其他情况

\(\mu(d)=\begin{cases}(-1)^k& d=p_1*p_2*...*p_k\\0& otherwise\end{cases}\)

莫比乌斯函数的性质

[ 性质 1 ] \(\sum\limits_{d|n}^{n}\mu(d)=[n==1]\)

证明:

将\(n\)分解质因数得\(n=p_1^{y_1}*p_2^{y_2}*...*p_k^{y_k}\)。任何一个质数的个数超过\(1\)时莫比乌斯函数值一定为\(0\),可以不管。我们只需要考虑有多少个质因数的质因数指数都为\(1\)。因此以上式子可以化为\[\sum\limits_{i=0}^{k}C^{i}_{k}*(-1)^i\]

利用二项式定理得\[\sum\limits_{i=0}^{k}\binom{k}{i}(-1)^i1^{k-i}=[(-1)+1]^k=0\]

[ 性质 2 ] \(\mu\)函数为积性函数:\(\mu(m*n)=\mu(m)*\mu(n)\) 其中\((m,n)=1\)

证明:

统统分类讨论即可。

设\(m=p_1^{x_1}*p_2^{x_2}*...*p_k^{x_k}\),\(n=q_1^{y_1}*q_2^{y_2}*...*q_t^{y_t}\)

则\(m*n=p_1^{x_1}*p_2^{x_2}*...*p_k^{x_k}*q_1^{y_1}*q_2^{y_2}*...*q_t^{y_t}\)

当\(\mu(m)=0或\mu(n)=0\)时,一定存在一个\(i\)满足\(x_i>1\)或\(y_i>1\),因此\(\mu(m*n)=0\)成立

当\(\mu(m),\mu(n)\)同号时,\(k,t\)奇偶性相同,则\(k+t\)为偶数,因此\(\mu(m*n)=1\)成立

当\(\mu(m),\mu(n)\)异号时,\(k,t\)奇偶性不同,则\(k+t\)为奇数,因此\(\mu(m*n)=-1\)成立

这几条都非常显然吧,还是非常容易证的



线性求莫比乌斯函数

莫比乌斯函数的线性求法依赖于线性筛素数(欧拉筛)。

其本质很简单,对于任何一个素数\(p\)一定满足\(\mu(p)=-1\)。

然后如果存在重复的素因子了,即\(i \% prime[j] = 0\)时,\(\mu\)一定为0. 对于其他情况,相当于在\(i\)的基础上又乘上了一个新的质因子\(prime[j]\),此时就应当乘上\(-1\)

inline void getMobius(){
    mu[1] = 1; //\mu函数的1是特殊情况
    for(int i = 2; i <= 1e6; ++i){
        if(!b[i]){
            prime[++tot] = i;
            mu[i] = -1; //质数的\mu值一定为-1
        }
        for(int j = 1; j <= tot; ++j){
            if(i * prime[j] > 1e6) break;
            b[i * prime[j]] = 1;
            if(i % prime[j] == 0){
                mu[i * prime[j]] = 0;//i中已经包括了prime[j]
                break;
            }
            else{
                mu[i * prime[j]] = -mu[i];//不能整除,意味着i中原没有prime[j]这个素因子
            }
        }
    }
}

莫比乌斯反演

莫比乌斯函数就是用来解决反演的问题的。

[ 公式 1 ]:\[F(n)=\sum\limits_{d|n}f(d) \xrightarrow[]{反演} f(n)=\sum\limits_{d|n}\mu(d)F(\dfrac{n}{d})\]

[ 证明 ] :

恒等式变形得\[\sum\limits_{d|n}\mu(d)F(\dfrac{n}{d})\]

\[=\sum\limits_{d|n}\mu(d)\sum\limits_{i|\frac{n}{d}}f(i)\]

\[=\sum\limits_{d|n}f(d) \ [\dfrac{n}{d}==1]=f(n)\]

[ 公式 2 ]:\[F(n)=\sum\limits_{n|d}f(d) \xrightarrow[]{反演} f(n)=\sum\limits_{n|d}\mu(\dfrac{d}{n})F(d)\]

[ 证明 ] :

道理类似。令\(k=\dfrac{d}{n}\),得\[\sum\limits_{n|d}\mu(\dfrac{d}{n})F(d)\]

\[=\sum\limits_{k=1}^{+\infty}\mu(k)F(nk)\]

\[=\sum\limits_{k=1}^{+\infty}\mu(k)\sum\limits_{nk|t}f(t)\]

\[=\sum\limits_{n|t}f(t)[\dfrac{t}{n}==1]=f(n)\]



问题一

求\[\sum\limits_{i=1}^{A}\sum\limits_{j=1}^{B}[gcd(i,j)==k]\]

解:

设\[f(x)=\sum\limits_{i=1}^{A}\sum\limits_{j=1}^{B}[gcd(i,j)==x]\]

显然\(f(k)\)即为答案。

构造\[F(x)=\sum\limits_{x|d}f(d)\]

有\[F(x)=\sum\limits_{x|d}\sum\limits_{i=1}^{A}\sum\limits_{j=1}^{B}[gcd(i,j)==d]\]\[=\sum\limits_{i=1}^{A}\sum\limits_{j=1}^{B}[x|gcd(i,j)]\]

由反演得\[f(x)=\sum\limits_{x|d}\mu(\dfrac{d}{x})F(d)\]

则答案为\[f(k)=\sum\limits_{k|d}\mu(\dfrac{d}{k})F(k)\]

考虑\(F(x)\)的意义,是所有数对中\(x\)的倍数的个数。可以推出\(F(x)=\left \lfloor \dfrac{A}{x} \right \rfloor \cdot \left \lfloor \dfrac{B}{x} \right \rfloor\)

由此\[f(k)=\sum\limits_{k|d}\mu(\dfrac{d}{k})\left \lfloor \dfrac{A}{k} \right \rfloor \cdot \left \lfloor \dfrac{B}{k} \right \rfloor\] \[f(k)=\sum\limits_{i}\mu(i)\left \lfloor \dfrac{A}{k} \right \rfloor \cdot \left \lfloor \dfrac{B}{k} \right \rfloor\]

所谓整除分块,就是用一种方法在\(O(\sqrt{n})\)的复杂度内求出\[\sum\limits_{i=1}^{n}\left \lfloor \dfrac{n}{i} \right \rfloor\]我们发现当\(i\)接近时,有可能有很多重复的值。整除分块的思想就是将所有重复的数值一起计算。

可以证明总共有不超过\(2\sqrt{n}\)个取值。也可以证明值为\(i\)的最后一个分母是第\(N\) / \((N\)/\(i)\)个。因此只需要每次取一段区间,然后将指针跳到下一个区间即可

回看莫比乌斯反演。假如我们得出了形如这样的反演式子\[f(n)=\sum\limits_{n|d}^{Min(A,B)}\mu(\dfrac{d}{n})\left \lfloor \dfrac{A}{n} \right \rfloor * \left \lfloor \dfrac{B}{n} \right \rfloor\]现在有两个整除的式子了,如何利用整除分块进行优化?

那么依然利用单个整除式的思想。每一个块要求\(\left \lfloor \dfrac{A}{n} \right \rfloor\)和\(\left \lfloor \dfrac{B}{n} \right \rfloor\)都相同。因此我们每次应当跳到单独的区间靠前的那个,这样才能满足两者数值相同

现在唯一的问题就是处理\(\mu\)了,\(\mu\)的值不是连续的,如果能够通过一种方法将\(\mu\)转化为一个类似前缀和的东西,就可以直接计算了。

对该式进行恒等变换。令\(k=\dfrac{d}{n}\):\[\sum\limits_{n|d}\mu(k)\left \lfloor \dfrac{A}{nk} \right \rfloor * \left \lfloor \dfrac{B}{nk} \right \rfloor\]其实\(k\)的意义就是\(d\)为\(n\)的几倍,因此不再需要枚举\(d\),直接枚举\(k\)即可,范围是\(nk \leq Min(A,B)\)。不妨将\(A,B\)都除上\(n\)。即\(A'=\dfrac{A}{n},B'=\dfrac{B}{n}\):\[\sum\limits_{k=1}\mu(k)\left \lfloor \dfrac{A'}{k} \right \rfloor * \left \lfloor \dfrac{B'}{k} \right \rfloor\]

至此,\(\mu\)已经和除式同步。因此只需要预处理\(\mu\)的前缀和即可

原文地址:https://www.cnblogs.com/qixingzhi/p/11137551.html

时间: 2024-10-29 18:27:44

「莫比乌斯反演」的相关文章

怎样将「插件化」接入到项目之中?

本期移动开发精英社群讨论的主题是「插件化」,上网查了一下,发现一篇 CSDN 博主写的文章<Android 使用动态载入框架DL进行插件化开发>.此处引用原作者的话: 随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余添加.项目新功能的加入,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,仅仅能紧急公布补丁版本号,强制用户进行更新.结果频繁的更新.反而easy减少用户使用黏性,或者是公司业务的不断发展,同系的应用越来越多,传统方式须要通过用户量最大的主项目进行引导下载并安装.

bzoj 2820 / SPOJ PGCD 莫比乌斯反演

那啥bzoj2818也是一样的,突然想起来好像拿来当周赛的练习题过,用欧拉函数写掉的. 求$(i,j)=prime$对数 \begin{eqnarray*}\sum_{i=1}^{n}\sum_{j=1}^{m}[(i,j)=p]&=&\sum_{p=2}^{min(n,m)}\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{p}\rfloor}[i⊥j]\newline&=&\sum_{p=

hdu1695(莫比乌斯反演)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意: 对于 a, b, c, d, k . 有 x 属于 [a, b],  y 属于 [c, d], 求 gcd(x, y) = k 的 x, y 的对数 . 其中 a = b = 1 . 注意: (x, y), (y, x) 算一种情况 . 思路: 莫比乌斯反演 可以参考一下: http://blog.csdn.net/lixuepeng_001/article/details/5057

算法学习——莫比乌斯反演(1)

.. 省选GG了,我果然还是太菜了.. 突然想讲莫比乌斯反演了 那就讲吧! 首先我们看一个等式-- (d|n表示d是n的约束) 然后呢,转换一下 于是,我们就发现! 没错!F的系数是有规律的! 规律is here! 公式: 这个有什么卵用呢? 假如说有一道题 F(n)可以很simple的求出来而求f(n)就比较difficult了,该怎么办呢? 然后就可以用上面的式子了 是莫比乌斯函数,十分有趣 定义如下: 若d=1,则=1 若d=p1*p2*p3...*pk,且pi为互异素数,则=(-1)^k

bzoj2301 [HAOI2011]Problem b【莫比乌斯反演 分块】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2301 很好的一道题.首先把每个询问转化为4个子询问,最后的结果就是这四个子询问的记过加加减减,类似二维前缀和.那么问题转化为在1 <= x <= lmtx, 1 <= y <= lmty时gcd(x, y) == k的对数,这个问题在转化一下,转化成1 <= x <= lmtx / k,1 <= y <= lmty / k时x与y互质的对数.莫比乌斯反

BZOJ2301: [HAOI2011]Problem b 莫比乌斯反演

分析:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 然后对于求这样单个的gcd(x,y)=k的,我们通常采用莫比乌斯反演 但是,时间复杂度是O(n*(n/k))的,当复杂度很坏的时候,当k=1时,退化到O(n^2),超时 然后进行分块优化,时间复杂度是O(n*sqrt(n)) #include<cstdio> #include<cstring> #include<queue

BZOJ2005: [Noi2010]能量采集 莫比乌斯反演的另一种方法——nlogn筛

分析:http://www.cnblogs.com/huhuuu/archive/2011/11/25/2263803.html 注:从这个题收获了两点 1,第一象限(x,y)到(0,0)的线段上整点的个数是gcd(x,y) 2,新学了一发求gcd(x,y)=k有多少对的姿势,已知0<x<=n,0<y<=m 令x=min(n,m),令f[i]代表gcd(x,y)=i的对数, 那么通过O(xlogx)的复杂度就可以得到f[1]到f[n](反着循环) 普通的容斥(即莫比乌斯反演)其实也

容斥原理与莫比乌斯反演的关系

//容斥原理,c[i]表示i当前要算的次数,复杂度和第二层循环相关 O(nlogn~n^2) LL in_exclusion(int n,int *c) { for(int i=0;i<=n;i++) c[i]=1; //不一定是这样初始化,要算到的才初始化为1 LL ans=0; for(int i=0;i<=n;i++) if(i要算) { ans+=(统计数)*c[i]; for(int j=i+1;j<=n;j++) if(i会算到j) c[j]-=c[i];//j要算的次数减去

「C语言」常量和变量的表示及应用

先发布,还在修改完善中.. 在程序运行中,其值不能改变的量成为常量.在基本数据类型中,常量可分为整型常量.实型常量.符号常量和字符型常量(包括字符常量和字符串常量),现分别介绍如下: 整型常量 即整常数,由一个或多个数字组成,可以带正负号 C语言中整型常量可用十进制.八进制和十六进制3种形式表示 十进制整数:由0~9数字组成,不能以0开始,没有前缀 八进制整数:以0为前缀,其后由0~7的数字组成,没有小数部分 十六进制整数:以0x或0X开头,其后由0~9的数字和a~f(或A~F字母组成) 另外长