莫比乌斯反演-从基础开始

提示:别用莫比乌斯反演公式,会炸的

只需要记住:

[gcd(i,j)=1]=\sum_{d|gcd(i,j)}\mu(d)

证明?其实很简单。

\mu函数有个性质

\sum_{d|n}\mu(d)=[d=1]

d替换成gcd(i,j)就是上面的那个暂且可以称作公式的式子了

例1

\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=1]\ \ \ \ (n

直接套公式啦

=\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{d|gcd(i,j)}\mu(d)

然后我们枚举d,显然有d\in[1,n]\ \ \ (d|gcd(i,j))

于是将d提到前面去,则i,j都是d的倍数,化简一下,得

=\sum_{d=1}^{n}\mu(d)*\lfloor\frac{n}{d}\rfloor*\lfloor\frac{m}{d}\rfloor

注意到后面那一坨是可以O(\sqrt n)分块做的

于是我们实现了O(n^2)O(\sqrt n)的过渡

简单吧

例2

\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=k]\ \ \ \ (n

好像与上一题有点不一样

但我们可以转化成一样的

同时除以k,得

=\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}[gcd(i,j)=1]

然后就一样了

例3

\sum_{i=1}^{n}\sum_{j=1}^{m}ij[gcd(i,j)=k]\ \ \ \ (n

老方法,同时除以k,只不过与上一题不同的是,我们需要考虑i,j的贡献

=\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}ij[gcd(i,j)=1]*k^2

有同学可能要问了

为什么最后要乘以一个k^2啊?

因为在i,j同时除以k的同时,中间那个ij的值就变了,i,j同时缩小到了原来的\frac{1}{k},所以最后要把缩小的乘回来,就是k^2

让我们继续套路,将中间那个gcd(i,j)用莫比乌斯替换掉

=\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{k}\rfloor}ij\sum_{d|gcd(i,j)}\mu(d)*k^2

提出d,同样,在最后乘以一个d^2

=\sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}\mu(d)*d^2\sum_{i=1}^{\lfloor\frac{n}{kd}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{kd}\rfloor}ij*k^2

各归各家,各找各妈

=k^2*\sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}\mu(d)*d^2\sum_{i=1}^{\lfloor\frac{n}{kd}\rfloor}i\sum_{j=1}^{\lfloor\frac{m}{kd}\rfloor}j

我们发现,最后那两项,不就是\dots等差数列吗?

时间复杂度O(n^2)\rightarrow O(\sqrt n)

来一个强的

例4

\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)

首先,小学奥数告诉我们

lcm(i,j)=\frac{i*j}{gcd(i,j)}

可以看看我的另外一篇博客莫比乌斯反演-从莫比乌斯到欧拉,里面详细地介绍了一种奇妙的反演方法,大致思路是用\phi函数替换\mu函数。我暂且把它叫做欧拉反演

但是注意,如果gcd(i,j)出现在分母这种不正常的位置,就不能用那个神奇的欧拉反演,而应该用常规方法。

先科普一下:积性函数,稍后会有用的

仍然是老套路,枚举gcd(i,j)

=\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{i*j}{d}*[gcd(i,j)=d]

同时除以d

=\sum_{d=1}^{n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}i*j*d*[gcd(i,j)=1]

=\sum_{d=1}^{n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}i*j*d\sum_{k|gcd(i,j)}\mu(k)

枚举k

=\sum_{d=1}^{n}d\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)*k^2\sum_{i=1}^{\lfloor\frac{n}{dk}\rfloor}i\sum_{j=1}^{\lfloor\frac{m}{dk}\rfloor}j

这时,这已经是一个O(n)的做法,观察可以得到,\lfloor\frac{n}{d}\rfloor可以分一次块,\lfloor\frac{n}{dk}\rfloor可以再分一次块,总时间复杂度是O(\sqrt n*\sqrt n)=O(n)

推到这里已经很牛逼了,但我们还有更好的方法,这个时间复杂度还能优化

后面那两坨等差数列很烦,我们把它换掉

T=dk,f(x)=\sum_{i=1}^{x}i,把原来那个式子换成

=\sum_{d=1}^{n}d\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)*k^2*f(\lfloor\frac{n}{T}\rfloor)*f(\lfloor\frac{m}{T}\rfloor)

看好了,下面的步骤很奇妙

用枚举gcd(i,j)的方法,我们枚举T

=\sum_{T=1}^{n}f(\lfloor\frac{n}{T}\rfloor)*f(\lfloor\frac{m}{T}\rfloor)\sum_{d|T}d*\mu(\frac{T}{d})*(\frac{T}{d})^2

=\sum_{T=1}^{n}f(\lfloor\frac{n}{T}\rfloor)*f(\lfloor\frac{m}{T}\rfloor)\sum_{d|T}d*\mu(d)*T

em\dots貌似没法用狄利克雷卷积

但别担心,我们观察最后这个式子

\sum_{d|T}d*\mu(d)*T

先不管T

\sum_{d|T}d*\mu(d)

F(T)=\sum_{d|T}d*\mu(d)

我们考虑a\perp b

F(a)=\sum_{d|a}d*\mu(d)

F(b)=\sum_{d|b}d*\mu(d)

显然a,bF(ab)的贡献是没有交集的,而这时,在我们枚举d时,它既可以是a的约数,也可以是b的约数,还能是ab的约数。具体来说,F(a)的某一项乘F(b)的某一项一定等于F(ab)的某一项(一个a的因子与一个b的因子相乘一定是ab的因子)

又因为a\perp b,故有

\mu(a的某个因子k)*\mu(b的某个因子j)=\mu(k*j)

所以,F不就是一个积性函数吗?

常识告诉我们,积性函数是可以O(n)筛的,F也一样

F(1)=1

如果a是质数,则

F(a)=1-a
如果a\perp b,则

F(a*b)=F(a)*F(b)

这三个公式易得出,我们考虑a\equiv 0\ (mod\ b)b是质数的情况

F(a*b)F(a)多出的几项中,d分解后,项b的次数一定大于1

想一想,为什么

因为,如果b这一项的次数小于等于1,它就一定在F(a)中被运算过了!(a一定有b这个质因子)

别忘了,当某个数的某个质因子次数大于1,它的\mu值就是0啊!

故此时

F(a*b)=F(a)

于是,我们推导出了F函数的转移公式,代码表示如下(顺便处理一下前缀和)

void sieve() {
    f[1]=sum[1]=1;
    for (int i=2;i<=10000000;i++) {
        if (!flag[i]) prime[++cnt]=i,F[i]=1-i;
        for (int j=1;j<=cnt&&i*prime[j]<=10000000;j++) {
            flag[i*prime[j]]=1;
            if (i%prime[j]==0) {//不互质
                F[i*prime[j]]=F[i];
                break;
            }
            F[i*prime[j]]=F[i]*F[prime[j]];//互质
        }
        sum[i]=sum[i-1]+f[i]*i;
    }
}

回到公式

=\sum_{T=1}^{n}f(\lfloor\frac{n}{T}\rfloor)*f(\lfloor\frac{m}{T}\rfloor)\sum_{d|T}d*\mu(d)*T

仔细看代码,最后那个T已经在前缀和中处理了

我们只需要分块求前面那两个f,后面那一坨O(1)处理(都筛出来了)

时间复杂度O(n)\rightarrow O(\sqrt n)

当你想降一下时间复杂度时,枚举第二个分块中的某一项再进行处理可能是一个好选择。

例5

\sum_{i=1}^{n}\sum_{j=1}^{m}d(i*j)

其中,d(i*j)表示i*j的约数个数

我们有一个公式

d(i*j)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]

很多人不知道这个公式是怎么推的,我来解释一下

其实,这里的[gcd(i,j)=1]并不是为了去重,而是为了和左边的式子保持相等

我们考虑一个质数pi=i'*p^{k_1},j=j'*p^{k_2},注意这里k_1,k_2可以为0

考虑pd(i*j)的贡献,显然,在d的因子中,p的这一项可以为0~k_1+k_2k_1+k_2+1

考虑等式右边,我们只看p这一项。x=x'*p^{k_x},y=y'*p^{k_y}

要满足gcd(x,y)=1,那么就有gcd(p^{k_x},p^{k_y})=1

要么k_x=0,k_y\in[0,k_2],共k_2+1

要么k_y=0,k_x\in[0,k_1],共k_1+1

减去重复判断的k_x=0,k_y=0这种情况,最后答案k_1+k_2+1

与等式左边相同!

剩下的步骤都很水了,所以我把这留作练习,如果你认真阅读了以上所有内容,那么这个练习就可以轻松解决。

练习

练习1

上面说了

练习2

\prod_{i=1}^{n}\prod_{j=1}^{m}f[gcd(i,j)]\ \ \ (n,m\leq 10^6,T\leq 1000)

f是斐波那契数列

练习3

\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)^k\ \ \ (n,m\leq 5*10^6,T\leq 2000)

注:练习2、练习3中,T是数据组数

后记

感谢lyc大佬的指导,在他的帮助与耐心解答下,我才初识了懵逼钨丝反演莫比乌斯反演

只要掌握方法,能够耐心地进行推导,莫比乌斯系列的题目其实不难

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 226,728评论 6 526
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 97,623评论 3 411
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 174,371评论 0 372
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,174评论 1 306
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,014评论 6 405
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,532评论 1 319
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,641评论 3 433
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,793评论 0 283
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,294评论 1 329
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,276评论 3 352
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,423评论 1 364
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,980评论 5 354
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,678评论 3 342
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,087评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,307评论 1 279
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,997评论 3 385
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,404评论 2 370

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,368评论 0 2
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,039评论 0 2
  • 为啥育儿经的说法经常“打架” 说起育儿经,那是每个父母都关心的话题,但是在怎么养育儿女这个话题上,各路专家是公说公...
    戰敭阅读 468评论 0 1
  • 是天生气质还是没有兴趣 孩子做起事来总是慢半拍,父母看在眼里真是又急又气,真恨不得帮孩子把所有的事情做完。但是...
    万花谷阅读 125评论 0 0
  • 阳春三月 微风不燥 你身袭花香 突然出现在眼前 额头上是未风干的汗珠 笑容里藏着欣喜的表情 我一步一步 默数感动 ...
    鸽子小姐阅读 357评论 0 2