莫比乌斯反演与杜教筛

以下内容均来自TA爷课件,我只是改了几个小的地方qwq

关于除法

  1. ni ⌊ n i ⌋ 只有 O(n) O ( n ) 种取值。
    2.对于 i i nni ⌊ n ⌊ n i ⌋ ⌋ 是与i被n除并下取整取值相同的一段区间的右端点。
    3.一个很有用的性质: nab=nab=nba ⌊ n a b ⌋ = ⌊ ⌊ n a ⌋ b ⌋ = ⌊ ⌊ n b ⌋ a ⌋
    上取整也有3所述的性质。

积性函数

f(ab)=f(a)f(b),(a,b)=1 f ( a b ) = f ( a ) f ( b ) , ( a , b ) = 1

完全积性:不要求 (a,b)=1 ( a , b ) = 1 。
考虑时一般会考虑成
f(x)=if(pkii) f ( x ) = ∏ i f ( p i k i )

f f 不是0的常值函数时, f(1)=1 f ( 1 ) = 1
积性函数的狄利克雷前缀和也是积性函数 1。
s(n)=d|nf(d)=ij=0kif(pij) s ( n ) = ∑ d | n f ( d ) = ∏ i ∑ j = 0 k i f ( p j i )

两个积性函数的狄利克雷卷积也是积性函数。
c(n)=d|na(d)b(nd)=ij=0kia(pji)b(pkiji) c ( n ) = ∑ d | n a ( d ) b ( n d ) = ∏ i ∑ j = 0 k i a ( p i j ) b ( p i k i − j )

积性函数可以线性筛出。线筛可以找到每个数 x x 的最小质因子 p1 p 1 及其次数 k1 k 1 。如果我们能以较小的代价 O(1) O ( 1 ) 求出 f(pk11) f ( p 1 k 1 ) ,便可以线筛了。

初等积性函数 μ μ

栗子:给定 n n m m ,求 ni=1mj=1[ij],n,m<=109 ∑ i = 1 n ∑ j = 1 m [ i ⊥ j ] , n , m <= 10 9 ,不用 μ μ 怎么做?

容斥!设dp数组 f(i,j) f ( i , j ) 为当 n=i,m=j n = i , m = j 时的答案。

f(n,m)=nmi=2min(n,m)f(ni,mi)  f ( n , m ) = n m − ∑ i = 2 min ( n , m ) f ( ⌊ n i ⌋ , ⌊ m i ⌋ )  

时间复杂度 O(i=1n(ni+i))=O(n34) O ( ∑ i = 1 ⌊ n ⌋ ( ⌊ n i ⌋ + i ) ) = O ( n 3 4 )

那么 μ μ 是什么?就是容斥系数!

μ(1)=1,μ(2)=1,μ(3)=1,μ(4)=0,μ(5)=1 μ ( 1 ) = 1 , μ ( 2 ) = − 1 , μ ( 3 ) = − 1 , μ ( 4 ) = 0 , μ ( 5 ) = − 1 …

μ(n)=0(1)k,, x2|nn=i=1kpi  μ ( n ) = { 0 , ∃   x 2 | n ( − 1 ) k , n = ∏ i = 1 k p i  

μ μ 显然是一个积性函数。
d|nμ(d)={10,,n=1n1 ∑ d | n μ ( d ) = { 1 , n = 1 0 , n ≠ 1

莫比乌斯反演

F(n)=d|nf(d) F ( n ) = ∑ d | n f ( d )

f(n)=d|nF(d)μ(nd)=d|nf(d)g|ndμ(g)=f(n) f ( n ) = ∑ d | n F ( d ) μ ( n d ) = ∑ d | n f ( d ) ∑ g | n d μ ( g ) = f ( n )

F(n)=n|df(d) F ( n ) = ∑ n | d f ( d )

f(n)=n|dF(d)μ(dn)=n|df(d)g|dnμ(g)=f(n) f ( n ) = ∑ n | d F ( d ) μ ( d n ) = ∑ n | d f ( d ) ∑ g | d n μ ( g ) = f ( n )

回到栗子:
i=1nj=1m[ij]=i=1nj=1md|(i,j)μ(d)=d=1min(n,m)μ(d)ndmd  ∑ i = 1 n ∑ j = 1 m [ i ⊥ j ] = ∑ i = 1 n ∑ j = 1 m ∑ d | ( i , j ) μ ( d ) = ∑ d = 1 min ( n , m ) μ ( d ) ⌊ n d ⌋ ⌊ m d ⌋  

当然这样还是做不了。。。
所以我们需要杜教筛!(后面再说吧。。)
不过大多数 μ μ 的题(第一步)这么化,所以这个式子还是比较重要的。

初等积性函数 φ φ

φ(n)=1~n与n互质的数的个数φ(n)=1~n与n互质的数的个数
所以由定义便可直接写出:

φ(n)=d|nμ(d)nd=ij=0kiμ(pji)pkij=ipki1i(pi1)  φ ( n ) = ∑ d | n μ ( d ) n d = ∏ i ∑ j = 0 k i μ ( p i j ) p k i − j = ∏ i p i k i − 1 ( p i − 1 )  

这样就可以线筛出来了,而且可以看出 φ φ 是一个积性函数。
从刚才的式子可以看出, φ φ 完全可以用 μ μ 代替,那么我们为什么需要 φ φ 呢?
很大一部分原因是它定义比较直观,比较容易想到。

φ φ 的性质:

d|nφ(d)=d|ndg|ndμ(g)=n  ∑ d | n φ ( d ) = ∑ d | n d ∑ g | n d μ ( g ) = n  

栗子:求
i=1nj=1m(i,j) ∑ i = 1 n ∑ j = 1 m ( i , j )
多组数据 t,n,m<=105 t , n , m <= 10 5
ans=i=1min(n,m)φ(i)nimi  a n s = ∑ i = 1 min ( n , m ) φ ( i ) ⌊ n i ⌋ ⌊ m i ⌋  

杜教筛

i=1nμ(i) ,n1011 ∑ i = 1 n μ ( i )   , n ⩽ 10 11

直接求不好求,但是我们有
i=1nd|iμ(d)=1 ∑ i = 1 n ∑ d | i μ ( d ) = 1

化一下蛤:
i=1nj=1niμ(j)=1 ∑ i = 1 n ∑ j = 1 ⌊ n i ⌋ μ ( j ) = 1

i=1nμ(i)=1i=2nj=1niμ(j) ∑ i = 1 n μ ( i ) = 1 − ∑ i = 2 n ∑ j = 1 ⌊ n i ⌋ μ ( j )

核心思想是枚举约数,这样就可以递推/递归求解了。

时间复杂度 O(n34) O ( n 3 4 )

但是注意到当 n n 比较小的时候其实我们可以 O(n) O ( n ) 线筛出来。

所以我们考虑分类讨论,线筛出≤B的,>B的递推。

时间复杂度 O(B+i=1nBni)=O(B+nB)  O ( B + ∑ i = 1 n B n i ) = O ( B + n B )  

求导一下可知在 B=n23 B = n 2 3 时取得最小值 O(n23) O ( n 2 3 )

回到栗子:这样的话最初的栗子就会做了吧~

i=1nj=1m[ij]=i=1nj=1md|(i,j)μ(d)=d=1min(n,m)μ(d)ndmd  ∑ i = 1 n ∑ j = 1 m [ i ⊥ j ] = ∑ i = 1 n ∑ j = 1 m ∑ d | ( i , j ) μ ( d ) = ∑ d = 1 m i n ( n , m ) μ ( d ) ⌊ n d ⌋ ⌊ m d ⌋  

注意到杜教筛的时候不仅是求出了 j=1nμ(j) ∑ j = 1 n μ ( j ) ,还顺便求出了所有的 j=1niμ(j) ∑ j = 1 ⌊ n i ⌋ μ ( j ) ,所以可以和普通的枚举除法完美契合。

那么怎么求 i=1nφ(i) ∑ i = 1 n φ ( i )

n(n+1)2=i=1nd|iφ(d)=i=1nj=1niφ(j) n ( n + 1 ) 2 = ∑ i = 1 n ∑ d | i φ ( d ) = ∑ i = 1 n ∑ j = 1 ⌊ n i ⌋ φ ( j )


转自:https://www.cnblogs.com/abclzr/p/6242020.html


  1. 不明白的地方。 ↩

你可能感兴趣的:(莫比乌斯反演与杜教筛)