背景
遇到过的莫比乌斯反演,除了狄雷克利卷积没看懂没做过外,我将遇到过的莫比乌斯反演大致分成以下三类。
三大莫比乌斯反演套路类型
1、i∈[1,n],j∈[1,m],求gcd(i,j)==1的数对个数。(n<=m)
∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = = 1 ] = ∑ i = 1 n μ ( i ) ⌊ n i ⌋ ⌊ m i ⌋ \sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==1]=\sum_{i=1}^nμ(i)\lfloor \frac{n}{i} \rfloor \lfloor \frac{m}{i} \rfloor ∑i=1n∑j=1m[gcd(i,j)==1]=∑i=1nμ(i)⌊in⌋⌊im⌋
反演从枚举i,j的最大公约数到枚举因子
例题:https://vjudge.net/problem/LightOJ-1144
2、i∈[1,n],j∈[1,m],求gcd(i,j)==k的数对个数。(n<=m)
∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = = k ] = ∑ i = 1 n μ ( i ) ⌊ n k i ⌋ ⌊ m k i ⌋ \sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==k]=\sum_{i=1}^nμ(i)\lfloor \frac{n}{ki} \rfloor \lfloor \frac{m}{ki} \rfloor ∑i=1n∑j=1m[gcd(i,j)==k]=∑i=1nμ(i)⌊kin⌋⌊kim⌋
将gcd(i,j)==k转化成gcd(i/k,j/k)==1,问题变成类型1
例题:https://www.luogu.com.cn/problem/P2522
3、i∈[1,n],j∈[1,m],求gcd(i,j)为质数的数对个数。(n<=m)
枚举每一个小于等于n的质数,问题回到类型2,可以得到公式
∑ k ∈ p r i m e n ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = = k ] = ∑ k ∈ p r i m e n ∑ i = 1 n μ ( i ) ⌊ n k i ⌋ ⌊ m k i ⌋ \sum_{k∈prime}^n\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==k]=\sum_{k∈prime}^n\sum_{i=1}^nμ(i)\lfloor \frac{n}{ki} \rfloor \lfloor \frac{m}{ki} \rfloor ∑k∈primen∑i=1n∑j=1m[gcd(i,j)==k]=∑k∈primen∑i=1nμ(i)⌊kin⌋⌊kim⌋
但是显然复杂度高的一批,于是可以优化为下式:
∑ i = 1 n ⌊ n i ⌋ ⌊ m i ⌋ ∑ j ∣ i , k ∈ p r i m e μ ( i j ) \sum_{i=1}^n\lfloor \frac{n}{i} \rfloor \lfloor \frac{m}{i} \rfloor\sum_{j|i,k∈prime}μ(\frac{i}{j}) ∑i=1n⌊in⌋⌊im⌋∑j∣i,k∈primeμ(ji)
显然右边的累加可以预处理出来(即每个数的质因子的μ值),用类似与埃氏筛的方法处理。
例题:https://www.luogu.com.cn/problem/P2257
莫比乌斯的一些小技巧
1、如果i和j为枚举的值时,如求数对之类不需要展开讨论的情况时,可直接套用整数分块加速循环(向下取整很多情况值固定)
2、如果i和j为某个数组的下标时,这种情况就需要展开进行讨论,需要枚举出每种情况。