浅谈算法——莫比乌斯函数,莫比乌斯反演和杜教筛

版权声明:本文为博主原创文章,未经博主允许可以转载,但要注明出处 https://blog.csdn.net/wang3312362136/article/details/81537164

莫比乌斯函数和莫比乌斯反演

前置技能

基础数论内容。

莫比乌斯函数

μ ( n ) 就是莫比乌斯函数,如果有:

n = i = 1 m p x i a i ( a i > 0 )

那么:

μ ( n ) = { 1 n = 1 ( 1 ) m a i 1 0 other

莫比乌斯函数有一个很重要的性质,那就是
d | n μ ( d ) = [ n = 1 ]

证明: n = 1 时显然。

n = 2 时考虑有一个 a i > 1 时显然对答案没有影响,那么答案就是 i = 0 n ( 1 ) i ( n k ) ,这个显然等于 0

莫比乌斯反演

若有

f ( x ) = d | x g ( d )


g ( x ) = d | x f ( d ) μ ( x d )

然而不知道有啥用……

例题

BZOJ 2301

其实就是求

i = a b j = c d [ gcd ( i , j ) = k ]

二维差分一下,这个就等价于求
i = 1 n j = 1 m [ gcd ( i , j ) = k ] i = 1 n / k j = 1 m / k [ gcd ( i , j ) = 1 ]

i = 1 n μ ( n ) = [ n = 1 ]

i = 1 n / k j = 1 m / k d | i , d | j μ ( d )

优先枚举 d
d = 1 n / k μ ( d ) i = 1 n / d k j = 1 n / d k 1

发现后面的一部分其实就是 n d k m d k ,因此式子就变成了
d = 1 n / k μ ( d ) n d k m d k

发现最后面的取值只有 O ( n ) 种,因此可以数论分块得到单次 O ( n )

BZOJ 4407

i = 1 n j = 1 m gcd ( i , j ) k

枚举 gcd ( i , j )

d = 1 n d k i = 1 n j = 1 m [ gcd ( i , j ) = d ] d = 1 n d k i = 1 n / d j = 1 m / d [ gcd ( i , j ) = 1 ]

发现后面是不是很熟悉?再一次用到那个神奇的公式
d = 1 n d k i = 1 n / d j = 1 m / d x | i , x | j μ ( x )

x 提前
d = 1 n d k x = 1 n / d μ ( x ) i = 1 n / d x j = 1 m / d x 1 d = 1 n d k x = 1 n / d μ ( x ) n d x m d x

f ( d ) = d k x = 1 n / d μ ( x ) ,则
d = 1 n f ( d ) n d x m d x

显然 f ( d ) 是一个积性函数,那么我们先线筛出 f ( d ) ,对 f ( d ) 做前缀和,就可以做到单次 O ( n ) 的复杂度了。

杜教筛

前置技能

莫比乌斯反演?

杜教筛

一个积性函数 f ( x ) ,怎么求前缀和 S ( x ) = i = 1 x f ( x )

我们找一个积性函数 g ( x ) (不知道它是啥),将它与 f ( x ) 做一遍卷积:

( f g ) ( n ) = d | n f ( d ) g ( n d )

将卷积做一遍前缀和:
i = 1 n ( f g ) ( i ) = i = 1 n d | i f ( d ) g ( i d ) = i = 1 n d | i g ( d ) f ( i d )

后面的部分可以变成
d = 1 n g ( d ) i = 1 n / d f ( i ) d = 1 n g ( d ) S ( n d )

因此
i = 1 n ( f g ) ( i ) = d = 1 n g ( d ) S ( n d )

移项

g ( 1 ) S ( n ) = i = 1 n ( f g ) ( i ) d = 2 n g ( d ) S ( n d )

观察到等式右边第一项就是 f g 的前缀和,第二项中 S ( n d ) 的取值最多只有 O ( n ) 种。

所以,如果 f g 很好求, g 的前缀和很好求,那么我们就可以很快的递归求出 S ( n ) 的值。

一般是打表算出前几项,然后递归算,注意一定要记忆化(hash/map均可)。

莫比乌斯函数的前缀和?

由于

d | n μ ( d ) = [ n = 1 ]

因此我们取 g ( x ) = 1 ,直接代入式子:
S ( n ) = 1 d = 2 n S ( n d )

欧拉函数?

由于

d | n φ ( d ) = n

因此取 g ( x ) = 1
S ( n ) = n × ( n + 1 ) 2 d = 2 n S ( n d )

总结

这些题大概都有套路?推式子的方法感觉都差不多……

猜你喜欢

转载自blog.csdn.net/wang3312362136/article/details/81537164
今日推荐