当前位置 博文首页 > forever_shi的博客:莫比乌斯反演 狄利克雷卷积 杜教筛 学习笔记

    forever_shi的博客:莫比乌斯反演 狄利克雷卷积 杜教筛 学习笔记

    作者:[db:作者] 时间:2021-09-21 15:13

    非常抱歉,这篇文章之前出锅了,如果对您产生了误导,在此向您道歉!
    前置知识:一些数论函数,比如欧拉函数、莫比乌斯函数的一些性质,积性函数及性质,整除分块。
    这里默认大家会前置知识,如果不会请自行学习。

    之前尝试看过,结果后来都忘光了,于是还是决定应该写个学习笔记记录一下。

    首先开始介绍莫比乌斯反演。
    我们设 f ( d ) f(d) f(d) F ( n ) F(n) F(n)为定义在非负整数集合上的两个函数,并且满足下列条件: F ( n ) = ∑ d ∣ n f ( d ) F(n)=\sum_{d|n}f(d) F(n)=dn?f(d)。那么根据莫比乌斯反演,有 f ( n ) = ∑ d ∣ n μ ( d ) F ( ? n d ? ) f(n)=\sum_{d|n}\mu(d)F(\lfloor\frac{n}{d}\rfloor) f(n)=dn?μ(d)F(?dn??)
    证明一会儿讲狄利克雷卷积之后再证。

    当然,如果是 F ( n ) = ∑ n ∣ d f ( d ) F(n)=\sum_{n|d}f(d) F(n)=nd?f(d),那么我们有 f ( n ) = ∑ n ∣ d μ ( ? d n ? ) F ( d ) f(n)=\sum_{n|d}\mu(\lfloor\frac{d}{n}\rfloor)F(d) f(n)=nd?μ(?nd??)F(d)

    莫比乌斯反演经常用来解决这样一类问题:我们要求 f ( n ) f(n) f(n),但是 f ( n ) f(n) f(n)并不好求,但是我们可以找到一个函数 F ( n ) F(n) F(n),满足 F ( n ) = ∑ d ∣ n f ( d ) F(n)=\sum_{d|n}f(d) F(n)=dn?f(d)或者 F ( n ) = ∑ n ∣ d f ( d ) F(n)=\sum_{n|d}f(d) F(n)=nd?f(d),并且 F ( n ) F(n) F(n)比较容易求出来,那么我们就可以求出 F ( n ) F(n) F(n),然后利用反演求出 f ( n ) f(n) f(n)。具体的代码实现时通常是用到整除分块来做到 O ( n ) O(\sqrt{n}) O(n ?)来算出结果。

    这里要用到一些复杂度优秀的筛法来预处理一些积性函数的前缀和,通常是 μ \mu μ函数。比较简单地,我们可以用线性筛求出 μ \mu μ函数等积性函数,然后 O ( n ) O(n) O(n)求前缀和。
    但是我们会发现有些题目是需要复杂度更优秀的筛法的。我暂时还不会洲阁筛和min_25筛,于是在这里介绍一下杜教筛。

    杜教筛是一种利用狄利克雷卷积来求前缀和的算法,所以在介绍杜教筛之前我先来介绍一下狄利克雷卷积。
    先介绍几种函数,以下函数都是积性函数。
    d ( n ) d(n) d(n):表示 n n n的约数个数。 d ( n ) = ∑ d = 1 n [ d ∣ n ] d(n)=\sum_{d=1}^n[d|n] d(n)=d=1n?[dn] [ ? ] [\ ] [?]应该是表示内部如果是true的话就是1,否则就是0的样子。
    e ( n ) e(n) e(n) e ( n ) = [ n = 1 ] e(n)=[n=1] e(n)=[n=1]
    1 ( n ) 1(n) 1(n):恒等函数,值始终是1
    i d ( n ) id(n) id(n