杜教筛初步

之前学杜教筛的时候感觉没有学的很明白,现在重新学习一遍。

杜教筛简介

何为杜教筛?
说直白一点就是在低于线性的时间内求出某个积性函数的前缀和。

假设现在我们有一个积性函数f(i),设S(i)=ij=1f(i)

我们要求S(n),假设我们找到了另一个任意数论函数g(i)

那么可以很轻松地得到如下的推导:

ni=1(fg)(i)=ni=1d|ig(d)f(id)=nd=1g(d)nd|if(id)=nd=1g(d)ndi=1f(i)=nd=1g(d)S(nd)

然后我们做进一步推导:

ni=1(fg)(i)=nd=1g(d)S(nd)=g(1)S(n)+nd=2g(d)S(nd)g(1)S(n)=ni=1(fg)(i)nd=2g(d)S(nd)

也就是说,如果我们能够找到一个积性函数g,并且我们能够快速计算(fg)的前缀和,g的前缀和,那么我们的问题就可以用我们最后得到的那个式子进行计算,具体来说就是可以用数论分块,然后最后一项进行递归处理。

例题

BZOJ 3944

Link

题意

求$\sum\limits{i=1}^{n} \varphi(i)\sum\limits{i=1}^{n} \mu(i)$。

n2311

题解

我们首先考虑ni=1φ(i)

按照刚才那套理论,我们需要找到一个函数g,并且(gφ)g的前缀和均能够容易求出。

我们不难想到,φI=id,并且id1的函数均可以很容易地求出。

所以不妨令g函数就是恒等函数I

那么我们就有:

S(n)=ni=1ini=2S(ni)

然后就可以前半部分用公式,后半部分数论分块+递归。

我们再来考虑ni=1μ(i)

按照刚才那套理论,我们需要找到一个函数g,并且(gμ)g的前缀和均能够容易求出。

我们不难想到μ1=ε

那么我们不妨令g为恒等函数I

于是我们带入得到:

S(n)=1ni=2S(ni)

直接数论分块+递归即可。

洛谷P3768 简单的数学题

Link

题意

求$\sum\limits{i=1} ^{n}\sum\limits\limits {j=1} ^{n} ij*gcd(i,j)$

n1010

题解

我们首先对原式进行反演。

Ans=ni=1nj=1ijgcd(i,j)=ni=1nj=1ijd|i,d|jφ(d)=nd=1φ(d)ni|dnj|dij=nd=1φ(d)d2ndi=1ndj=1ij=nd=1φ(d)d2(ndi=1i)2=nd=1φ(d)d2ndi=1i3

现在的问题就是快速求出φ(d)d2的前缀和。

我们设f(i)=φ(i)i2S(i)=ij=1f(j)

现在我们要找到函数g,使得我们能够快速计算(fg)的前缀和,g的前缀和。

也就是说,我们需要能够快速求以下这个式子:

Ans=ni=1d|if(d)g(id)=ni=1d|iφ(d)d2g(id)我们不妨令g(i)=i2Ans=ni=1d|iφ(d)i2=ni=1i3

所以我们只需要使g(i)=i2,然后继续使用刚才的刚才的方法就可以完成此题。

Powered By Valine
v1.5.2