首页 > 代码库 > 算法学习——莫比乌斯反演(1)

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

。。

省选GG了,我果然还是太菜了。。

突然想讲莫比乌斯反演了

那就讲吧!

首先我们看一个等式——

技术分享

 

d|n表示dn的约束

然后呢,转换一下

技术分享

 

于是,我们就发现!

技术分享

 

没错!F的系数是有规律的!

规律is here

公式:

技术分享

 

这个有什么卵用呢?

假如说有一道题

F(n)可以很simple的求出来而求f(n)就比较difficult了,该怎么办呢?

然后就可以用上面的式子了

技术分享是莫比乌斯函数,十分有趣

定义如下:

d=1,则技术分享=1

d=p1*p2*p3...*pk,pi为互异素数,则技术分享=(-1)^k

否则技术分享=0

然后,莫比乌斯函数有一些奇(luan)(qi)(ba)(zao)的性质——

1、技术分享

 

这个嘛。。二项式定理算一下就推出来了

2技术分享是积性函数。什么是积性函数?即对于所有互质的x,yf(x)*f(y)=f(x*y),嗯,积性函数的前缀和也是积性函数。

于是,你就能看到莫比乌斯反演的神奇之处了!

来看一道题

Bzoj2301 Problem b

题意

给你Ta,b,c,d,k(a<=x<=b,c<=y<=d)有多少组gcd(x,y)=k

T<=50000,a<=b<=50000,c<=d<=50000

p[x][y](1<=a<=x,1<=b<=y)中,gcd(a,b)=1的个数

所以,ans=p[b/k][d/k]-p[b/k][c/k]-p[a/k][d/k]+p[a/k][b/k](容斥233,可以抽象成一个平面)

然后,设f(i)(1<=x<=n,1<=y<=m)gcd(x,y)==i的个数

发现——很难求。。但我们可以设F(i)(1<=x<=n,1<=y<=m)i|gcd(x,y)的个数

这个求起来就非常simple了!

技术分享很显然。。

然后,根据莫比乌斯反演的公式——技术分享

就可以做了!

哦对了,莫比乌斯函数是可以线性筛出来的,那个叫杜教筛,可以baidu一下

推一下式子——

技术分享

然后。。暴力枚举k的倍数。。就可以做了。

ButO(n)GG的!所以我们要加优化!

仔细一看,发现技术分享技术分享个取值,所以技术分享技术分享技术分享个取值,只要暴力枚举这些取值,维护一下前缀和就好了

最后,顺便%一下PoPoQQQhttps://wenku.baidu.com/view/fbec9c63ba1aa8114431d9ac.html

End.

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